[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

コメント

PAGE TOP
Ads Block Detector Powered by codehelppro.com
Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました