目次
ゼロ
今回は、エクセルマクロ内のエラー処理を無効にする「On Error GoTo 0 」の記述をテストしてみたいと思います。
「On Error GoTo 0 」より上の行でエラー処理の記述をしていても「On Error GoTo 0 」より下の行では、エラー処理が無効になるようです。
![VBA のエラー処理。 [ 3 ] のエラーは処理継続して [ 4 ] へ進む。 [ 6 ] のエラーは一旦「 a: 」にジャンプして [ 7 ] [ 8 ] と進んで一行下の [ 9 ] に戻る。 [ 11 ] のエラーでマクロ中断。](https://pulogu.net/wordpress/wp-content/uploads/2023/09/004-2-300x254.png)
On Error GoTo 0 を入れた場合の一例
下記マクロの、
[ 1 ] の「On Error Resume Next」より下の行でエラーが発生した場合、そのまま処理が継続されるようです。
[ 5 ] の「On Error GoTo a」より下の行でエラーが発生した場合、「a:」の行まで一旦ジャンプして「Resume Next」の命令文でエラー発生行の次の行まで戻ってきます。
[ 1 ] の「On Error Resume Next」の効力が無くなるようです。
[ 11 ] の「On Error GoTo 0」より下の行でエラーが発生した場合、エラーで処理が中断されます。 [ 1 ] と [ 5 ] のエラー処理が無効になるようです。
[ 8 ] の「Resume Next」が「Resume」になっていると、 [ 9 ] では無く [ 6 ] に戻ってしまい [ 6 ] ~ [ 8 ] を無限ループしてしまいます。
Sub On_Error_GoTo_0を入れた場合()
'[ 1 ] から [ 12 ] の順番で処理されます。
'[ 12 ] でエラーが発生して処理が中断されます。
'エラーが発生する行を緑色に着色してあります。
On Error Resume Next '[ 1 ]
Debug.Print Range("xxxxxx1").Address '[ 2 ]
Debug.Print Err.Number '[ 3 ]
Debug.Print Err.Description '[ 4 ]
On Error GoTo a '[ 5 ]
Debug.Print Range("xxxxxx1").Address '[ 6 ]
Debug.Print Err.Number '[ 9 ]
Debug.Print Err.Description '[ 10 ]
On Error GoTo 0 '[ 11 ]
Debug.Print Range("xxxxxx1").Address '[ 12 ]
Debug.Print Err.Number
Debug.Print Err.Description
On Error GoTo b
Debug.Print Range("xxxxxx1").Address
Debug.Print Err.Number
Debug.Print Err.Description
Exit Sub
a:
Debug.Print "a: エラー発生" '[ 7 ]
Resume Next '[ 8 ]
b:
Debug.Print "b: エラー発生"
Resume Next
End Sub
On Error GoTo 0 を入れない場合の一例
下記マクロの、
[ 1 ] より下の行でエラーが発生した場合、そのまま継続されます。
[ 5 ] より下の行でエラーが発生した場合、「a:」の行に一旦ジャンプして、「Resume Next」の命令文でエラーが発生した次の行に戻って来ます。
[ 16 ] より下の行でエラーが発生した場合、「b:」の行に一旦ジャンプして、「Resume Next」でエラーが発生した次の行に戻って来ます。
[ 22 ] の「Exit Sub」でマクロを終了します。この記述が無いと、そのまま下の行に進んで「a:」と「b:」の中の処理を行ってしまいます。
Sub On_Error_GoTo_0を入れない場合()
'[ 1 ] から [ 22 ] の順番で処理されます。
'[ 22 ] のマクロ完了まで処理されます。
'エラーが発生する行を緑色に着色してあります。
On Error Resume Next '[ 1 ]
Debug.Print Range("xxxxxx1").Address '[ 2 ]
Debug.Print Err.Number '[ 3 ]
Debug.Print Err.Description '[ 4 ]
On Error GoTo a '[ 5 ]
Debug.Print Range("xxxxxx1").Address '[ 6 ]
Debug.Print Err.Number '[ 9 ]
Debug.Print Err.Description '[ 10 ]
'On Error GoTo 0 をコメントアウト(命令文をコメント化して実行しない) しました。
Debug.Print Range("xxxxxx1").Address '[ 11 ]
Debug.Print Err.Number '[ 14 ]
Debug.Print Err.Description '[ 15 ]
On Error GoTo b '[ 16 ]
Debug.Print Range("xxxxxx1").Address '[ 17 ]
Debug.Print Err.Number '[ 20 ]
Debug.Print Err.Description '[ 21 ]
Exit Sub '[ 22 ]
a:
Debug.Print "a: エラー発生" '[ 7 ] [ 12 ]
Resume Next '[ 8 ] [ 13 ]
b:
Debug.Print "b: エラー発生" '[ 18 ]
Resume Next '[ 19 ]
End Sub
On Error GoTo 0 直下に On Error Resume Next を入れた場合の一例
Sub On_Error_GoTo_0直下にOn_Error_Resume_Nextを入れた場合()
'[ 1 ] から [ 6 ] の順番で処理されます。
'[ 6 ] のマクロ完了まで処理されます。
'エラーが発生する行を緑色に着色してあります。 On Error GoTo 0 '[ 1 ] On Error Resume Next '[ 2 ] Debug.Print Range("xxxxxx1").Address '[ 3 ] Debug.Print Err.Number '[ 4 ] Debug.Print Err.Description '[ 5 ] End Sub '[ 6 ]
On Error GoTo 0 直下に On Error GoTo 行ラベル を入れた場合の一例
Sub On_Error_GoTo_0直下にOn_Error_GoTo_行ラベルを入れた場合()
'[ 1 ] から [ 8 ] の順番で処理されます。
'[ 8 ] のマクロ完了まで処理されます。
'エラーが発生する行を緑色に着色してあります。 On Error GoTo 0 '[ 1 ] On Error GoTo a '[ 2 ] Debug.Print Range("xxxxxx1").Address '[ 3 ] Debug.Print Err.Number '[ 6 ] Debug.Print Err.Description '[ 7 ] Exit Sub '[ 8 ] a: Debug.Print "a: エラー発生" '[ 4 ] Resume Next '[ 5 ] End Sub
オー
On_Error_GoTo_O(オー)ではなく On_Error_GoTo_0(ゼロ)のようです。
Sub On_Error_GoTo_オーの場合()
On Error GoTo 0 'ゼロ
On Error GoTo O 'オー
End Sub

テスト環境
- Windows 10(64 ビット)
- Microsoft Office Excel 2003
以上、閲覧ありがとうございました。




