[VBA]On Error GoTo lineを複数回使用できない。

事象

On Error GoToで、2回ERRORを拾おうとしたが、2回目のエラーが拾えない。

例えば、下記の様なコードを実行すると、

Sub testGoto2Times()
    Dim a1, a2
    On Error GoTo Err1
    a1 = 1 / 0
Err1:
    Debug.Print "Err1"
    
    On Error GoTo Err2
    a2 = 1 / 0          'ここでERROR
Err2:
    Debug.Print "Err2"
End Sub

a2 = 1 / 0で、

実行時エラー '11':

0 で除算しました。

と、表示され、実行出来ない。

ググってると、On Error GoTo 0という処理を入れるといいと出てきたが、下記コードでも同様のエラーでダメ。

Sub testGoo0()
    Dim a1, a2
    On Error GoTo Err1
    a1 = 1 / 0
Err1:
    Debug.Print "Err1"
    
    On Error GoTo 0     'On Error GoTo 0を追加
    On Error GoTo Err2
    a2 = 1 / 0          'ここでERROR
Err2:
    Debug.Print "Err2"
End Sub

もう少し調べると、On Errorステートメントの説明に次のようにあった。

“有効” エラー ハンドラー: On Error ステートメントによってオンにされるエラー ハンドラー

“アクティブ” エラー ハンドラー: エラーの処理中の有効なハンドラー

エラー ハンドラーがアクティブな間にエラーが発生した場合 (エラーの発生と Resume、Exit Sub、Exit Function、または Exit Property ステートメントの間)、

現在のプロシージャのエラー ハンドラーはエラーを処理できない コントロールは呼び出し元のプロシージャに戻します。

https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/on-error-statement

つまり、On Error処理がActiveになった後、Resume、Exit Sub、Exit Function、Exit Propertyが走るまで、そのプロシージャ内で発生したエラーに対してトラップが効かないということらしい。

解決策

Resumeを使うとOK。下記のようにすると、正常に処理されるようになった。

Sub testResume()
    Dim a1, a2
    On Error GoTo Err1
    a1 = 1 / 0
Err1:
    Debug.Print "Err1b"     '表示される
    Resume Res1             'Resumeを追加
    Debug.Print "Err1a"     '表示されない
Res1:
    On Error GoTo Err2
    a2 = 1 / 0
    Debug.Print "Err2b"     '表示されない
Err2:
    Debug.Print "Err2a"     '表示される
End Sub

コメントを残す

メールアドレスが公開されることはありません。