On Errorステートメントでのエラー処理

エラー処理

 On Errorステートメントを用いた、エラー処理のサンプルコードとメモです。

ポイント

 ・On Errorステートメント
 ・Resumeステートメント
 ・Errオブジェクト

 エラーが発生した場合に、それに対応するルーチンに移るか無視するかを、On Errorステートメントで制御し、エラーナンバーや原因をErrオブジェクトで調べる。

※サンプルコードがエラーで中断される場合
 ・VBEのオプション設定を変更 参照
 ・プロジェクトをロックする 参照
 ブックファイルを配布の際に、プロジェクトをロックしておくと、ユーザーのコンピューターのVBE設定にかかわらず、On Errorステートメントが有効になる。


サンプルコード

エラーに対する、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

Excel Tips for Teachers

Copyright (C) 2009- 坂江 保 All Rights Reserved.