当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】HandleErrでエラートラップ

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 でマクロを終了することになります。

エラー処理文を入れると少し煩雑になるので、次回以降の記事ではこうした記述を省いた簡易版マクロを載せますが、必要な場合はこの記事を参照しながらエラー処理を付け加えるようにしてください。

≫ [VBA入門講座] コイン投げマクロを作ります
 

エクセルや数学に関するコメントをお寄せください