Excel VBA入門 その81:エラー処理を2回目以降も処理できる方法

エクセルVBA VBA



VBAにて「On Error Go To 行ラベル」を実行した場合、1回目のエラー処理は上手く処理されるものの、2回目のエラーはエラー処理されずに普通にエラーになってマクロが中断してしまう・・・という質問がかなり寄せられます。

今回は、2回目のエラー処理を行う方法について徹底的に解説していきます。



エラー処理を2回目以降も処理できる方法

1回目のエラー処理は上手くいっても、2回目のエラーは何故かエラートラップに行かずにデバッグモードになってマクロが止まってしまう・・・ということがあります。

なぜか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 を解除する方法

コメント

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