事象
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
コメント