エラー On_Error・Resumeステートメント

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

On Error ステートメント

エラー処理ルーチンを有効にし、プロシージャ内でのエラー処理ルーチンの位置を指定します。エラー処理ルーチンを無効にするときに使うこともできます。

  • 構文

  • On Error GoTo line
  • On Error Resume Next
  • On Error GoTo 0
  • On Error ステートメントの形式は次のとおりです。
  • ステートメント 内容

  • On Error GoTo line
  • 引数 lineに指定した行から始まるエラー処理ルーチンを有効にします。
  • 引数 line は必ず指定します。
  • 引数 line には任意の行ラベルまたは行番号を指定します。
  • 実行時エラーが生成されると、ここで設定したエラー処理ルーチンにプログラムの制御が移り、エラー処理ルーチンがアクティブになります。
  • 引数 line に指定する行は、On Error ステートメントと同じプロシージャ内に存在しなければなりません。
  • この制限に従わなければ、コンパイル時エラーが発生します。
  • On Error Resume Next
  • 実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行を継続します。
  • オブジェクトを操作する場合は、On Error GoTo ステートメントではなく、このステートメントを使ってください。
  • On Error GoTo 0
  • 現在のプロシージャに含まれる使用可能なエラー処理ルーチンを無効にします。
  • 解説

  • On Error ステートメントを使用していない場合に実行時エラーが発生すると、そのエラーは致命的エラーになり、エラー メッセージが表示されてプログラムの実行が停止します。
  • "使用可能な" エラー処理ルーチンとは、On Error ステートメントによって有効になっている処理ルーチンのことです。
  • "アクティブな" エラー処理ルーチンとは、エラー処理中の使用可能な処理ルーチンのことです。
  • エラー処理ルーチンがアクティブになっている間 (エラーの発生と Resume、Exit Sub、Exit Function、または Exit Property ステートメントの間) は、カレント プロシージャのエラー処理ルーチンはエラーを処理できません。
  • 制御は呼び出し側のプロシージャに戻ります。
  • 呼び出し側のプロシージャに使用可能なエラー処理ルーチンがあれば、そのルーチンがエラーを処理するためにアクティブになります。
  • 呼び出し側のプロシージャのエラー処理ルーチンもアクティブであれば、使用可能で非アクティブなエラー処理ルーチンが見つかるまで、制御はプロシージャを呼び出したプロシージャへと引き渡されます。
  • 使用可能で非アクティブなエラー処理ルーチンが見つからなければ、そのエラーは実際に発生した位置で致命的なエラーになります。
  • エラー処理ルーチンがコントロールを呼び出し側のプロシージャに戻すたびに、そのプロシージャがカレント プロシージャになります。
  • いずれかのプロシージャ内でエラー処理ルーチンによってエラーが処理されると、Resume ステートメントで指定した時点でカレント プロシージャ内で実行が再開されます。
  • メモ

  • エラー処理ルーチンは、Sub プロシージャまたは Function プロシージャではありません。行ラベルまたは行番号で識別されるコードの一部分です。
  • エラー処理ルーチンは、Err オブジェクトの Number プロパティを基にエラーの原因を判別します。
  • また、エラー処理ルーチンは他のエラーが発生する前、またはエラーを引き起こすプロシージャが呼び出される前に、関連する Err オブジェクトのプロパティの値をテストまたは保存する必要があります。
  • Err オブジェクトのプロパティの値には、最新のエラーだけが反映されます。Err オブジェクトの Number プロパティに関連付けられたエラー メッセージは、Err オブジェクトの Description プロパティに指定されています。
  • On Error Resume Next ステートメントは、実行時エラーを発生させたステートメントの直後にあるステートメント、または On Error Resume Next ステートメントを含むプロシージャから最後に呼び出しを行った直後のステートメントを使って、実行を継続します。
  • このステートメントを使って、実行時エラーが生成されても処理を続けることができます。
  • プロシージャ内の他の場所に制御を移動せずに、エラー処理ルーチンをエラーが発生する可能性のある場所に配置できます。
  • On Error Resume Next ステートメントは、別のプロシージャが呼び出されるとアクティブでなくなるので、そのルーチン内でインライン エラー処理を行う場合は、呼び出される各ルーチン内で On Error Resume Next ステートメントを実行する必要があります。
  • メモ

  • 他のオブジェクトを操作しているときに発生したエラーを処理する場合は、On Error GoTo ステートメントよりも On Error Resume Next 構造の方が適しています
  • オブジェクトとの各やり取りの後で Err オブジェクトを調べることにより、どのオブジェクトをコードで操作したのかどうかを確認します。
  • Err オブジェクトの Number プロパティにエラー コードを設定したオブジェクト、および最初にエラーを発生させたオブジェクトを Err オブジェクトの Source プロパティで調べることができます。
  • On Error GoTo 0 ステートメントは、現在のプロシージャ内のエラー処理を無効にします
  • プロシージャに番号が 0 の行が含まれていても、その行はエラー処理コードの先頭として指定されません。
  • On Error GoTo 0 ステートメントを指定していない場合、エラー処理ルーチンはプロシージャの終了時に自動的に無効になります。
  • エラーの発生時以外にエラー処理コードが実行されないようにするには、そのエラー処理ルーチンの直前に Exit SubExit Function、または Exit Property のうち、該当するステートメントを配置します。
  • 次に例を示します。
  • Option Explicit


    Private Sub test1()
    Dim a As Double
        Debug.Print "A"
    On Error GoTo Jump
        a = 2 / 0 '───┐
        Debug.Print "B" '┼┐
        a = 2 / 1       '││
        Debug.Print "C" '││
    Exit Sub            '││
        Debug.Print "D" '││
    Jump: '───────┘│
        Debug.Print "E" '  │
    Resume Next '─────┘
        Debug.Print "F"
    'A
    'E
    'B
    'C

    End Sub
  • この例では、エラー処理コードは Exit Sub ステートメントと End Sub ステートメントの間にあり、通常のプロシージャの流れから区切られています。
  • エラーを処理するためのコードは、プロシージャ内の任意の場所に配置できます。
  • オブジェクトを実行可能ファイルとして実行しているときにオブジェクトでトラップできないエラーが発生すると、制御側のアプリケーションにエラーが返されます。開発環境では、トラップできないエラーは、適切にオプションが設定されている場合のみ制御側のアプリケーションに返されます。
  • 使用しているホスト アプリケーションのマニュアルでデバッグ時にどのオプションを設定する必要があるのか、オプションの設定方法、およびホスト アプリケーションがクラスを作成できるかどうかを参照してください。
  • 他のオブジェクトを操作するオブジェクトを作成する場合、他のオブジェクトから未処理のまま返されるエラーを処理する必要があります。
  • このようなエラーを処理できない場合は、Err オブジェクトの Number プロパティを使用して作成したエラーの 1 つにエラー コードを割り当てます。
  • 次に、作成したオブジェクトを呼び出しているアプリケーションにエラーを引き渡します。エラーを指定するには、エラー コードを定数 vbObjectError に追加します。
  • たとえば、エラー コードが 1052 であれば、次のように代入します。

    Err.Number = vbObjectError + 1052
  • メモ

  • ダイナミック リンク ライブラリ (DLL)または Macintosh のコード リソースを呼び出しているときに発生するエラーは、Visual Basic のエラー トラップではトラップされません。
  • DLL 関数を呼び出す場合、各関数の戻り値を API の仕様を基に確認し、処理が完了したかどうか、または失敗したかどうかを判断します。
  • 次に、エラーが発生したイベントで Err オブジェクトの LastDLLError プロパティの値を確認します。
  • Macintosh では、LastDLLError プロパティは、常に 0 の値を返します。

Resume ステートメント

エラー処理ルーチンの終了後に、プログラムの実行を再開します。

  • 構文

  • Resume [0]
  • Resume Next
  • Resume line
  • Resume ステートメントの構文の形式は次のとおりです。
  • ステートメント 内容

  • Resume [0]
  • エラー処理ルーチンと同じプロシージャ内でエラーが発生した場合、エラーの原因となったステートメントからプログラムの実行が再開されます。
  • 呼び出されたプロシージャ内でエラーが発生した場合、エラー処理ルーチンを含むプロシージャが最後に呼び出したステートメントからプログラムの実行が再開されます。
  • Resume Next
  • エラー処理ルーチンと同じプロシージャ内でエラーが発生した場合、エラーの原因となったステートメントの次のステートメントからプログラムの実行が再開されます。
  • 呼び出されたプロシージャ内でエラーが発生した場合、エラー処理ルーチンを含むプロシージャが最後に呼び出したステートメントの次のステートメント、または On Error Resume Next ステートメントからプログラムの実行が再開されます。
  • Resume line
  • 引数 line に指定した行からプログラムの実行が再開されます。
  • 引数 line は必ず指定します。引数 line には行ラベルまたは行番号を指定します。
  • また、エラー処理ルーチンと同じプロシージャに指定する必要があります。
  • 解説

  • エラー処理ルーチン以外の場所で Resume ステートメントを使用すると、エラーが発生します。

On Error ステートメントResume ステートメントの使用例

Option Explicit


Private Sub test1()
'*******************
'On Error GoTo line
'*******************

Dim a As Double, b As Byte
b = 1
    Debug.Print "①"
On Error GoTo Jump
    a = 2 / 0
    Debug.Print "②"
    a = 2 / b
    Debug.Print "③"
Exit Sub
    Debug.Print "④"
Jump:
    Debug.Print "⑤"
Resume Next
    Debug.Print "⑥"
'①
'⑤
'②
'③
End Sub


Private Sub test2()
'*******************
'On Error Resume Next
'*******************

Dim a As Double, b As Byte
b = 1
    Debug.Print "①"
On Error Resume Next
    a = 2 / 0
    Debug.Print "②"
    a = 2 / b
    Debug.Print "③"
Exit Sub
    Debug.Print "④"

'①
'②
'③
End Sub


Private Sub test3()
'*******************
'On Error GoTo 0
'*******************

Dim a As Double

    Debug.Print "①"
On Error Resume Next
    a = 2 / 0
    Debug.Print "②"
On Error GoTo 0
    Debug.Print "③"
On Error Resume Next
    Debug.Print "④"
    a = 2 / 0
    Debug.Print "⑤"
Exit Sub
    Debug.Print "⑥"
'①
'②
'③
'④
'⑤
End Sub


Private Sub testA()
'*******************
'Resume [0]
'*******************

Dim a As Double, b As Byte
b = 0
    Debug.Print "①"
On Error GoTo Jump
    a = 2 / b
    Debug.Print "②"
    b = b - 1
    a = 2 / b
    Debug.Print "③"
Exit Sub
    Debug.Print "④"
Jump:
    Debug.Print "⑤"
    b = b + 1
Resume
    Debug.Print "⑥"
'①
'⑤
'②
'⑤
'③
End Sub


Private Sub testB()
'*******************
'Resume Next
'*******************

Dim a As Double, b As Byte
b = 1
    Debug.Print "①"
On Error GoTo Jump
    a = 2 / 0
    Debug.Print "②"
    a = 2 / b
    Debug.Print "③"
Exit Sub
    Debug.Print "④"
Jump:
    Debug.Print "⑤"
Resume Next
    Debug.Print "⑥"
'①
'⑤
'②
'③
End Sub


Private Sub testC()
'*******************
'Resume line
'*******************

Dim a As Double, b As Byte
b = 1
    Debug.Print "①"
On Error GoTo Jump
    a = 2 / 0
ReTry:
    Debug.Print "②"
    a = 2 / b
    Debug.Print "③"
Exit Sub
    Debug.Print "④"
Jump:
    Debug.Print "⑤"
Resume ReTry
    Debug.Print "⑥"
'①
'⑤
'②
'③
End Sub

 

 

2000年01月01日|[VBサンプルコード]:[Error]