VBA数学マクロ入門講座です。今回は前回のマクロをもとに、ユーザーさんがどのような値を入力しても対応できるようなエラー処理を学びます。マクロを個人的に使用するだけなら、ここまで神経質になる必要はないのですが、アプリケーションを開発してネットで配布したり、社内でマクロを共有する場合などには、こうしたエラー処理は必須となります。
【VBA】HandleErrでエラーを処理します
前回のマクロの一部を再掲します。
Sub Divisor() Dim i As Long, j As Double j = InputBox("整数を入力してください") If j <> Int(j) Then MsgBox "整数ではありません" '・・・中略・・・ End Sub
このマクロを実行して数値の入力を促されたときに、ひらがなで「にじゅうご」と入れてしまうと(そんな人はいないと思いますが、あらゆる事態に備えるという心構えのために極端な例を示しています)、
実行時エラー'13' 型が一致しません
というエラーメッセージが表示され、デバッグするかどうかの選択が与えられます。ワークシート上で実行しても、VBEウィンドウが開いてコードが現れます。
ちゃんとエラーが表示されてプログラムが止まるからそれでいいじゃないか、と思われるかもしれませんが、これはあくまで開発者向けのメッセージであって、何も知らないユーザーさんがこんな画面を見せられても混乱するだけです。そこでユーザーさん向けにわかりやすく簡潔なエラーメッセージを表示されるように作り変える必要があります。さて上記のエラーをあえて起こして、ダイアログで [デバック] を選択すると
j = InputBox("整数を入力してください")
という箇所が黄色に塗られて「ここで引っかかっているよ」と教えてくれます。変数 j は Double型で宣言していたので、文字列である「にじゅうご」が入力されてデータ型の不一致が生じていたのです。
要はこの行で「データ型の不一致」のエラーが起きることが分かれば、それで対処できます。マクロにたった4行を足すだけです。
Sub Divisor() Dim i As Long, j As Double On Error GoTo HandleErr j = InputBox("整数を入力してください") If j <> Int(j) Then MsgBox "整数ではありません" Else For i = 1 To j If j Mod i = 0 Then Debug.Print i; End If Next i End If Exit Sub HandleErr: MsgBox "数値ではありません" End Sub
赤い文字が追加された部分です。
On Error GoTo HandleErr
はエラートラップと呼ばれるステートメントで、この記述以降で何かエラーが発生した場合、
HandleErr:
まで飛んでエラー処理を実行します。上のマクロではメッセージボックスに「数値ではありません」と表示するようになっています。しかし、もう1つ注意しなくてはならないのは、他に何も書かないと、エラーでない場合にも全ての処理が終わった段階でプログラムは HandleErr: の行を読み込んでしまうということです。それを防ぐためにその直前に
Exit Sub
という強制的にマクロから抜け出すステートメントを付け加えておきます。これによって、エラーがあれば即座に「 HandleErr: 」の行まで進んでエラー処理を施し、エラーがない場合は通常処理を実行して Exit Sub でマクロを終了することになります。
エラー処理文を入れると少し煩雑になるので、次回以降の記事ではこうした記述を省いた簡易版マクロを載せますが、必要な場合はこの記事を参照しながらエラー処理を付け加えるようにしてください。
エクセルや数学に関するコメントをお寄せください