エラー処理2012.11.10
On Errorステートメントでのエラー処理
ポイント
・On Errorステートメント
・Resumeステートメント
・Errオブジェクト
エラーが発生した場合に、それに対応するルーチンに移るか無視するかを、On Errorステートメントで制御し、エラーナンバーや原因をErrオブジェクトで調べる。
※サンプルコードがエラーで中断される場合
・VBEのオプション設定を変更 参照
・プロジェクトをロックする 参照
ブックファイルを配布の際に、プロジェクトをロックしておくと、ユーザーのコンピューターのVBE設定にかかわらず、On Errorステートメントが有効になる。
Excelマクロ管理ツール
サンプルコード
エラーに対する、On ErrorとResumeステートメントの働きを調べる。
Sub Error_Sample() Dim i As Long Dim dblAns As Double On Error Resume Next 'エラーが発生しても無視して次に進む dblAns = 100 / i On Error GoTo 0 MsgBox dblAns ' 1.#INF(「0」除算により結果が誤った形式で表示) On Error GoTo ERROR 'エラーが発生したらERRORラベルに制御を移す dblAns = 100 / i On Error GoTo 0 MsgBox dblAns ' 5 Exit Sub ERROR: i = 20 Resume 'エラーが発生した箇所に制御を戻す End Sub
メモ
On Errorステートメント
エラー発生時に処理を行う、そのプロシージャ内でのルーチンの位置を指定。
エラー処理ルーチンを無効にするときにも使用できる。
Exit Subなどで、そのプロシージャを抜けた場合、エラー処理ルーチンは無効になる。
構文1:On Error GoTo line
引数[line]に指定した行から始まる、エラー処理ルーチンを有効にする。
引数[line]には任意の行ラベルまたは行番号を必ず指定。
実行時エラーが発生すると、[Line]に指定したルーチンにプログラムの制御が移る。
指定する行は、On Errorステートメントと同じプロシージャ内に存在しなければならない。
構文2:On Error Resume Next
実行時エラーが発生してもプログラムを中断せず、エラーの次のステートメントから実行を継続。
オブジェクトを伴うエラーは、Errオブジェクトで原因を探ることができるため、このステートメントを使用すると良い。
構文3:On Error GoTo 0
現在のプロシージャに含まれる、エラー処理ルーチンを無効にする。
Resumeステートメント
エラー処理ルーチンの終了後に、プログラムの実行を再開する。
構文1:Resume [0]
[0]は省略可能。
エラー処理ルーチン後、エラーの原因となったステートメントからプログラムを再開。
構文2:Resume Next
エラー処理ルーチン後、エラーの原因となったステートメントの、次のステートメントからプログラムを再開。
構文3:Resume line
引数[line]に指定した行からプログラムの実行を再開。
次のサンプルコードは、ResumeとResume Nextの働きの違いを示す。
Sub Error_Test_1() Dim i As Long Dim dblAns As Double On Error GoTo ERROR dblAns = 100 / i MsgBox dblAns ' 5 Exit Sub ERROR: i = 20 Resume End Sub
Sub Error_Test_2() Dim i As Long Dim dblAns As Double On Error GoTo ERROR dblAns = 100 / i MsgBox dblAns ' 1.#INF(「0」除算により結果が誤った形式で表示) Exit Sub ERROR: i = 20 Resume Next End Sub
Errオブジェクト
Errオブジェクトは、実行時エラーに関する情報を保有している。
●実行時エラーが発生すると、そのエラーを識別するための情報、エラー処理で利用可能な情報が、Errオブジェクトに格納される。
●Errオブジェクトの各プロパティは、エラー処理ルーチン内の Exit Sub、Exit Function、Exit Property、Resume Next ステートメントの後で、0 または長さ 0 の文字列 ("") にリセットされる。
●コード内で実行時エラーを生成するときには、Raiseメソッドを使う。
【主なメンバ】
・Numberプロパティ エラー発生時にエラー番号が設定される
・Sourceプロパティ エラー発生元のオブジェクトまたはアプリケーションの名前が設定される。
・Descriptionプロパティ エラー発生時にエラーに関連する説明の文字列をが設定される。
・Clearメソッド Errオブジェクトのすべてのプロパティの設定値をクリアする。
・Raiseメソッド 実行時エラーを生成。下記は使用例。
Sub Raise_Error() Dim strMsg As String On Error Resume Next ' エラーのトラップを留保 With Err .Clear .Raise 6 ' "オーバーフロー" エラーを発生 If .Number <> 0 Then strMsg = "エラー番号 " & Str(.Number) & vbCrLf & .Source & _ " でエラーが発生しました。" & vbCrLf & .Description MsgBox strMsg, , "エラー", .HelpFile, .HelpContext End If End With End Sub