エラーダイアログの内容はプログラムで取得可能
VBAのプログラムを作っていると、いろんなエラーを目にします。
エラーはエラーダイアログの形で見ることが多いのですが、VBAのコードでも取得することができます。
取得するのはエラーダイアログにも表示されているエラー番号とエラー内容です。
エラー番号とエラー内容
エラーはErrオブジェクトで管理されます。Errオブジェクトには一番最後に発生したエラー情報が設定されています。
エラーダイアログに表示されている内容もErrオブジェクトの情報が利用されています。
エラーが発生した際にErrオブジェクトにエラー情報が格納され、Err.Numberプロパティでエラー番号が取得でき、Err.Descriptionプロパティでエラー内容が取得できます。
エラー処理
エラー処理はErrオブジェクトを利用して行います。
Err.Numberプロパティにはエラー発生時の番号が設定されています。エラーが発生していない場合はErr.Numberプロパティは0が設定されています。
そこで、Err.Numberプロパティを利用して、エラーが発生したかどうかを判別することが出来ます。
サンプルコード
数値を扱うInteger型に文字列を代入しようとしてエラーになるサンプルです。
エラー発生時にエラー番号、エラー内容、ヘルプファイルのパスを出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub ErrObjectTest() On Error GoTo ERR_LABEL Dim cnt As Integer cnt = "test" '// 正常時はここで処理を終了させる Exit Sub ERR_LABEL: '// エラー未発生時はここで処理を終了させる If Err.Number = 0 Then Exit Sub End If '// エラー内容を出力 Debug.Print Err.Number & ":" & Err.Description & ":" & Err.HelpFile End Sub |
実行結果
1 |
13:型が一致しません。:C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA7\1041\VbLR6.chm |
エラーが発生すると11行目の行ラベルに移動します。
エラー処理の書き方は大きく2通りあります。
コメントにしていますが9行目のように行ラベルの直前で処理を終了する方法と、行ラベルの直後にエラー未発生時は処理を終了する方法です。
どちらで書いてもいいのですが、ここでは後者の行ラベルの直後にエラー未発生判定を行う方法で書いています。
エラー処理が必要な理由
VBAでプログラムを作る場合、出来るだけエラーが発生しないようにするべきですが、どうしても避けられない場合やエラーを許容した方が都合がいい場合があります。
たとえば、Book1などの未保存のブックの情報をFileSystemObjectクラスで取得しようとするとエラーが発生します。
それを回避するために、処理条件を分けるのも一つの方法ですが、エラーを許容してエラー処理をした方が都合がよい、と判断することもあります。
そのような場合はErrオブジェクトを利用してエラー処理を行います。
経験則ですが、力技でエラーを回避するよりもエラー処理を書いた方が処理はすっきりすることが多いです。