VBA⑧|On Errorの使い方 ~VBAでエラーを回避する実践方法とサンプルコード
Excel VBAを使っていると、思わぬエラーで処理が止まってしまう経験は誰しもあるでしょう。たとえば「存在しないファイルを開こうとした」「ゼロで割った」など、コードを書いていると避けられないエラーに直面します。
そんなとき役立つのが On Error ステートメント です。
VBAでは、エラー発生時の挙動を開発者が制御できます。
処理を止めずに続行したり、専用のエラーハンドラーに飛ばしてメッセージを出したりできるのです。
この記事では、VBA初心者から実務で使う方まで役立つようにサンプルコード付きでわかりやすく解説します。
VBAでエラー処理が必要な理由
まずは「なぜエラー処理が必要なのか」を整理しましょう。
処理が途中で止まるのを防ぐ
標準設定ではエラーが発生すると処理が強制終了します。
これではユーザーが開発側の想定外の使用した場合にエラーが出て処理が止まってしまい、また最初からとなると使ってもらえなくなってしまいます。ユーザーフレンドリーなアプリにする
たとえば「ファイルが見つかりません」と案内できれば、ユーザーは原因を理解しやすいです。デバッグや保守をしやすくする
エラーが起きたときに「どの行で」「どんなエラーが起きたか」を記録すれば、修正がスムーズになります。
つまりエラー処理は、単なる「防御策」ではなく、実務で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のエラー処理をマスターすれば、より堅牢で使いやすいマクロを作ることができます。ぜひ自分のコードに取り入れてみてください。
いいなと思ったら応援しよう!
応援ありがとうございます!