見出し画像

VBA⑧|On Errorの使い方 ~VBAでエラーを回避する実践方法とサンプルコード

Excel VBAを使っていると、思わぬエラーで処理が止まってしまう経験は誰しもあるでしょう。たとえば「存在しないファイルを開こうとした」「ゼロで割った」など、コードを書いていると避けられないエラーに直面します。

そんなとき役立つのが On Error ステートメント です。
VBAでは、エラー発生時の挙動を開発者が制御できます。
処理を止めずに続行したり、専用のエラーハンドラーに飛ばしてメッセージを出したりできるのです。

この記事では、VBA初心者から実務で使う方まで役立つようにサンプルコード付きでわかりやすく解説します。


VBAでエラー処理が必要な理由

まずは「なぜエラー処理が必要なのか」を整理しましょう。

  1. 処理が途中で止まるのを防ぐ
    標準設定ではエラーが発生すると処理が強制終了します。
    これではユーザーが開発側の想定外の使用した場合にエラーが出て処理が止まってしまい、また最初からとなると使ってもらえなくなってしまいます。

  2. ユーザーフレンドリーなアプリにする
    たとえば「ファイルが見つかりません」と案内できれば、ユーザーは原因を理解しやすいです。

  3. デバッグや保守をしやすくする
    エラーが起きたときに「どの行で」「どんなエラーが起きたか」を記録すれば、修正がスムーズになります。

つまりエラー処理は、単なる「防御策」ではなく、実務でVBAを活用するための必須スキルなのです。


On Errorの基本構文

On Error Resume Next

最もよく使われるのが Resume Next です。これは「エラーが発生しても処理を止めず、次の行へ進む」という指定です。

Sub Sample1()
    On Error Resume Next  ' エラーが出ても処理を続ける
    Debug.Print 1 / 0     ' ゼロ除算 → エラー発生
    Debug.Print "処理が続きます"
    On Error GoTo 0       ' エラー処理を解除
End Sub

この場合、「1 / 0」のエラーは無視され「処理が続きます」と表示されます。
ただし、Resume Nextの乱用はNG です。
原因がわからないままスルーしてしまうと、あとでバグの温床になります。


On Error GoTo ラベル

もう一つの代表的な方法が GoTo ラベル です。
エラーが発生すると、指定したラベルにジャンプしてエラーハンドリングを行います。

Sub Sample2()
    On Error GoTo ErrorHandler
    
    Dim x As Integer
    x = 1 / 0   ' ここでエラー
    
    Exit Sub
    
ErrorHandler:
    MsgBox "エラー発生: " & Err.Description
    Resume Next
End Sub

この例では、ゼロ除算のエラーが発生すると「エラー発生: 除算の結果がゼロです」とメッセージが表示されます。
Resume Nextを併用すると、メッセージ確認後に処理を継続できます。


On Error GoTo 0

On Error GoTo 0 は「エラー処理を解除する」命令です。
Resume Nextを設定したままだと、どんなエラーも無視されてしまいます。そのため、Resume Nextを使ったあとは必ずGoTo 0で解除するのが鉄則です。


Errオブジェクトを使ったエラー制御

VBAでは、エラーが起きると Err オブジェクトに詳細が格納されます。
代表的なプロパティは以下の通りです。

  • Err.Number … エラー番号(例:11 = ゼロ除算)

  • Err.Description … エラーメッセージ

  • Err.Source … エラーが発生したモジュール名

例:エラー番号で分岐するコード

Sub Sample3()
    On Error Resume Next
    
    Dim y As Integer
    y = 1 / 0
    
    If Err.Number <> 0 Then
        MsgBox "エラー番号: " & Err.Number & vbCrLf & _
               "内容: " & Err.Description
        Err.Clear   ' エラー情報をクリア
    End If
    
    On Error GoTo 0
End Sub

これによりエラーが起きた場合に「どんなエラーか」を判別し、適切な処理に分けられます。


実務で役立つエラー処理のベストプラクティス

1. Resume Nextの乱用を避ける

「とりあえず止まらないように」という目的でResume Nextを多用すると、エラーが隠れてしまいます。
最低限、Errオブジェクトで確認する仕組みを組み合わせましょう。

2. エラーごとに処理を分ける

例えばエラーの内容によって「ファイルが存在しない場合は新規作成」「アクセス拒否なら警告を出す」といった分岐を作ると、業務アプリとしての完成度が上がります。

3. ログを残す

業務システムでは、エラー発生時にログファイルへ書き出す仕組みが重要です。

Open "errorlog.txt" For Append As #1
Print #1, Now & " エラー " & Err.Number & ": " & Err.Description
Close #1

といった形で、テキストファイルに残しておくとトラブルシューティングが楽になります。

4. 想定外のエラーはユーザーに対処法を通知する

ユーザーに「原因不明で止まりました」と出すより、「システム管理者に連絡してください」と何をすべきかをガイドする方が親切です。


まとめ

  • On Errorは「処理を止めずに制御するための仕組み」

  • Resume Next は一時的な回避に便利だが乱用は避ける

  • GoTo ラベルを使うとエラーハンドリングを整理できる

  • Errオブジェクトを活用すれば詳細な制御が可能

  • 実務では「ログ保存」「エラー番号ごとの処理」「ユーザー通知」が重要

VBAのエラー処理をマスターすれば、より堅牢で使いやすいマクロを作ることができます。ぜひ自分のコードに取り入れてみてください。



いいなと思ったら応援しよう!

Rin Sumi Zeal 応援ありがとうございます!