【Excel VBA】例外処理に対応|エラートラップ

当ページのリンクには広告が含まれている可能性があります。
VBAエラートラップ

こんにちは、ユーキです。

今日は、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通り

少しでもお役に立てば幸いです。

スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

旅好き職業プログラマ。文系大学卒業後、ITソフトウエア開発会社に勤務してプログラミング言語を学ぶ。現在は転職し、プロジェクトマネージャ的ポジションで生産管理システムの開発にあたる。
得意言語は、VB、VB.NET、C#.NET、Java、SQLなど。

目次