エラーダイアログの内容はプログラムで取得可能

VBAのプログラムを作っていると、いろんなエラーを目にします。

エラーはエラーダイアログの形で見ることが多いのですが、VBAのコードでも取得することができます。

取得するのはエラーダイアログにも表示されているエラー番号とエラー内容です。

エラー番号とエラー内容

エラーはErrオブジェクトで管理されます。Errオブジェクトには一番最後に発生したエラー情報が設定されています。

エラーダイアログに表示されている内容もErrオブジェクトの情報が利用されています。

エラーが発生した際にErrオブジェクトにエラー情報が格納され、Err.Numberプロパティでエラー番号が取得でき、Err.Descriptionプロパティでエラー内容が取得できます。

エラー処理

エラー処理はErrオブジェクトを利用して行います。

Err.Numberプロパティにはエラー発生時の番号が設定されています。エラーが発生していない場合はErr.Numberプロパティは0が設定されています。

そこで、Err.Numberプロパティを利用して、エラーが発生したかどうかを判別することが出来ます。

サンプルコード

数値を扱うInteger型に文字列を代入しようとしてエラーになるサンプルです。

エラー発生時にエラー番号、エラー内容、ヘルプファイルのパスを出力しています。

実行結果

 

エラーが発生すると11行目の行ラベルに移動します。

エラー処理の書き方は大きく2通りあります。

コメントにしていますが9行目のように行ラベルの直前で処理を終了する方法と、行ラベルの直後にエラー未発生時は処理を終了する方法です。

どちらで書いてもいいのですが、ここでは後者の行ラベルの直後にエラー未発生判定を行う方法で書いています。

エラー処理が必要な理由

VBAでプログラムを作る場合、出来るだけエラーが発生しないようにするべきですが、どうしても避けられない場合やエラーを許容した方が都合がいい場合があります。

たとえば、Book1などの未保存のブックの情報をFileSystemObjectクラスで取得しようとするとエラーが発生します。

それを回避するために、処理条件を分けるのも一つの方法ですが、エラーを許容してエラー処理をした方が都合がよい、と判断することもあります。

そのような場合はErrオブジェクトを利用してエラー処理を行います。

経験則ですが、力技でエラーを回避するよりもエラー処理を書いた方が処理はすっきりすることが多いです。