こんにちは、ユーキです。
今日は、VBAのエラー処理(エラートラップ)について、お話したいと思います。
エラートラップとは
想定外の「予期せぬエラー」(ゼロで割り算しようとした、ファイル読み込みで該当ファイルがないなど)が発生すると、プログラムそこで終了してしまいます。
ゼロで割り算しようとした、ファイル読み込みで該当ファイルがないなど、あらかじめエラーが発生しないようチェック処理を書いていくことは可能ですが、すべてのエラーに対しチェック処理を追加することは現実的ではありません。
この「予期せぬエラー」が発生した場合の処理を記述し、「エラーが発生したら、こういう処理をしてね」とエラー発生時の処理をひとくくりにするような記述することができます。
このような処理をエラートラップ(エラー時処理)といいます。
エラートラップの書き方
エラートラップですが、VBAではいくつか記述方法があります。
On Error Resume Next
エラーが発生しても、次の処理を実行してくださいという指示になります。
以下のように使用します。
Private Sub divide()
On Error Resume Next
Dim a As Integer
Dim b As Integer
a = 10
b = 0
'ゼロ割となるので、実行されない
Debug.Print (a / b)
Debug.Print "処理終了"
End Sub
On Error GoTo
こちらは、エラーが発生した場合、指定したラベルに遷移するという指示になります。
コードは以下のようになります。
Private Sub divide()
On Error GoTo ErrLabel
Dim a As Integer
Dim b As Integer
a = 10
b = 0
'ゼロ割発生!
Debug.Print (a / b)
Debug.Print "処理終了"
'これを書いておかないと、エラー処理部分まで処理が実行されてしまう
Exit Sub
ErrLabel:
'エラー処理部
Debug.Print "エラー終了"
End Sub
ラベルを定義しておき、エラー発生時はそこに処理が行くようにします。通常処理部には、レベルの前で処理を抜けるよう「Exit Sub」を入れます。
これがないと、エラー処理部まで実行されてしまうので、注意が必要です。
ラベル名は、ラベル部とGotoの後の文字列が一致していれば、何でもOKです。
Goto文は基本、使わないというのが鉄則なのです。ただし、VBAのエラートラップだけは例外です。これを使わないとエラートラップできませんから。
Resume Next と Goto どっちがいいの?
ケースバイケースとしか言えないですが、Resume Nextで処理を続行したとしてもエラーになった処理部はスキップされているため、想定通りの挙動にならない可能性があります。
エラーが発生しても後続処理に影響がないのであれば、Resume Next でよいですが、基本は、Goto文でエラー時処理を書くことになると思います。
まとめ
今回のおさらいになります。
- 予期せぬエラーが発生してもプログラムが終了しないようにする
- やり方は、On Error Resume Next か On Error GoTo (ラベル) の2通り
少しでもお役に立てば幸いです。