目次
ゼロ
今回は、エクセルマクロ内のエラー処理を無効にする「On Error GoTo 0 」の記述をテストしてみたいと思います。
「On Error GoTo 0 」より上の行でエラー処理の記述をしていても「On Error GoTo 0 」より下の行では、エラー処理が無効になるようです。
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
以上、閲覧ありがとうございました。