VBAにて「On Error Go To 行ラベル」を実行した場合、1回目のエラー処理は上手く処理されるものの、2回目のエラーはエラー処理されずに普通にエラーになってマクロが中断してしまう・・・という質問がかなり寄せられます。
今回は、2回目のエラー処理を行う方法について徹底的に解説していきます。
エラー処理を2回目以降も処理できる方法
1回目のエラー処理は上手くいっても、2回目のエラーは何故かエラートラップに行かずにデバッグモードになってマクロが止まってしまう・・・ということがあります。
Sub 2回目がエラーになるコード例()
for i=1 to 100
on error goto err1 ・・・①
(処理)(該当データがエラーのときここでの処理は終わりにしたい)
err1: ・・・②
(処理)(特にエラー処理はなく次のステップへと流したい)
on error goto err2 ・・・③
(処理)(該当データがエラーのときここでの処理は終わりにしたい)
err2: ・・・④
(処理)(特にエラー処理はなく次のステップへと流したい)
next i
End Sub
①にてエラーがあったときに、正常に②へ飛ぶものの・・・、
③にてエラーのときは何故か④へ飛ばずに「エラーメッセージ」が発生し、処理が中断してしまいます。その原因について説明していきます。
2回目のエラー処理ができない原因
2回目のエラーが処理(トラップ)されないのは、エラー処理中のエラーはトラップされないからです。
これを概念的に説明すると以下のようになります。
コード内に以下の2つの制御があるとします。
「エラーを検知して、エラー処理の箇所に飛ばす制御A」
「制御Aから飛んできたエラーの処理を実行する制御B」
1回目のエラーが発生すると、制御Aから制御Bに飛びます。
制御Bでエラー処理を実施するものの、そのまま制御Bに居続けるため、さらにエラーが発生すると、そのままエラー表示になってしまうのです。
したがって、エラー処理中のエラーはトラップされないのです。
2回目以降もエラー処理をする方法
2回目のエラー処理を実行するには、Resumeステートメントを使います。
Resumeステートメントは、エラーが発生した行から処理を再実行するものです。
ちなみに、Resume せずに Goto を使っても制御Bから抜け出した事にはなりません。
具体的な使い方は、以下のようになります。
Sub Test()
For i = 1 To 100
On Error GoTo err1
(処理)(該当データがエラーのときここでの処理は終わりにしたい)
Step1:
(処理)(特にエラー処理はなく次のステップへと流したい)
On Error GoTo err2
(処理)(該当データがエラーのときここでの処理は終わりにしたい)
Step2:
(処理)(特にエラー処理はなく次のステップへと流したい)
Next i
Exit Sub
err1:
Resume Step1
err2:
Resume Step2
End Sub
また、もしデータなどの存在の有無でエラートラップを使用する場合には、そもそもエラートラップを使わずに、以下のコード例のように If 文などの条件判定を行う方法もあります。
Sub エラートラップを使用しない()
If Dir(ファイルAパス) <> "" Then
ElseIf Dir(ファイルBパス) <> "" Then
ElseIf Dir(ファイルCパス) <> "" Then
End If
【まとめ】エラー処理を2回目以降も処理できる方法
2回目のエラーが処理(トラップ)されないのは、エラー処理中のエラーはトラップされないからです。
2回目のエラー処理を実行するためには、Resumeステートメントを使います。
他の方法としては、If 文などの条件判定を行う方法もあります。
参考:Excel VBA入門 その79:On Error Resume Next を解除する方法
コメント