Memorandum

エラー処理

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
ページトップへ戻る
Copyright(C) 2009- 坂江保 All Rights Reserved.