Excel VBAでは、処理中に思わぬエラーが発生することがあります。存在しないファイルを開こうとした、シートが削除されていた、数値の代わりに文字列が入っていた——そんな場面でマクロが突然止まってしまうと、利用者は何が起きたかわかりません。
こうした事態を防ぐのがエラー処理です。この記事では On Error GoTo の基本構文から、ログ出力を組み合わせた応用例まで解説します。
On Error GoToの基本構文を理解するには?
VBAのエラー処理の基本形は次のとおりです。
Sub Sample()
On Error GoTo ErrorHandler
' 通常の処理
Sheets("売上").Range("A1").Value = "テスト"
MsgBox "処理が完了しました。"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub
各部分の役割を整理します。
On Error GoTo ErrorHandler
エラーが発生したら ErrorHandler: というラベルの場所に処理を飛ばす、という指定です。
Exit Sub
正常に処理が終わった場合はここで終了します。これを書かないと、エラーがなくても ErrorHandler: 以降が実行されてしまうため、必ず書きます。
Err.Description
発生したエラーの内容(説明文)を文字列で取得するプロパティです。MsgBoxに組み合わせて利用者に伝えます。
ファイルが開けないときのエラー処理を書くには?
Sub OpenFile()
On Error GoTo ErrorHandler
Workbooks.Open "C:¥ファイル1.xlsx"
MsgBox "ファイルを開きました。"
Exit Sub
ErrorHandler:
MsgBox "ファイルが開けませんでした: " & Err.Description
End Sub
指定したファイルが存在しない場合、Err.Description でエラーの詳細を確認できます。利用者に対して「何が問題だったか」をわかりやすく伝えることができます。
エラー内容をログファイルに記録するには?
エラー処理にログ出力を組み合わせると、後から原因を追えるようになります。
Sub SaveWithLog()
On Error GoTo ErrorHandler
ActiveWorkbook.Save
MsgBox "保存が完了しました。"
Exit Sub
ErrorHandler:
Dim msg As String
msg = "エラー発生: " & Now & " - " & Err.Number & " " & Err.Description
Open "C:¥log.txt" For Append As #1
Print #1, msg
Close #1
MsgBox "エラーが発生しました。ログに記録しました。"
End Sub
Err.Number でエラー番号、Err.Description で内容、Now で発生日時を取得し、テキストファイルに追記しています。利用者向けのメッセージと、開発者向けのログを両立できる構成です。
よくあるエラーと事前対策の考え方とは?
エラー処理で対応するだけでなく、事前にチェックして回避する方法も重要です。
| 状況 | 対策のポイント |
|---|---|
| シート名の指定ミス | 存在チェックをしてからアクセスする、またはエラー処理で回避 |
| ファイルが見つからない | Dir 関数で事前にファイルの存在を確認する |
| 数値が想定外の形式 | IsNumeric 関数で事前に型チェックする |
エラー処理はあくまでも「万が一の備え」です。想定できるケースは事前チェックで防ぎ、予期しないエラーだけをエラーハンドラーで受け取る設計が理想です。
まとめ
On Error GoTo ErrorHandlerでエラー発生時の処理先を指定するExit Subを忘れずに書かないと正常終了時もエラーハンドラーが実行されるErr.Descriptionでエラー内容、Err.Numberでエラー番号を取得できる- ログ出力(
Open〜Print〜Close)と組み合わせると後から原因を追えるマクロになる - 想定できるエラーは事前チェックで防ぎ、予期しないエラーをエラーハンドラーで受け取る設計が理想
よくある質問
On Error Resume Nextとの違いは何ですか?
On Error Resume Next はエラーが発生しても処理を止めずに次の行へ進む命令です。エラーを無視して続行するため、原因が見えなくなるリスクがあります。特定の処理だけエラーを許容したい場面に限定して使い、基本は On Error GoTo を使う方が安全です。
エラーハンドラーの後に処理を再開するにはどうすればいいですか?
Resume または Resume Next を使います。Resume はエラーが発生した行に戻って再実行、Resume Next はエラーの次の行から処理を再開します。ただし、原因が解消されていない場合は再度エラーになるため慎重に使います。
Err.Numberはどんなときに使いますか?
エラーの種類を番号で判別して、エラーごとに異なる処理を分岐させたいときに使います。例えば If Err.Number = 9 Then で「インデックスが有効範囲にない」というエラーだけを特別に処理することができます。
複数の処理にエラー処理を入れるとコードが長くなりませんか?
1つの Sub に1つのエラーハンドラーで対応できます。処理全体を1つの On Error GoTo でまとめて管理し、エラー発生時は Err.Number や Err.Description で内容を確認するのが現実的な設計です。
エラー処理を入れていないマクロは危険ですか?
自分だけが使う簡単なマクロであれば問題ないケースもありますが、他の人が使うマクロや定期実行するマクロでは、エラーが出たときに処理が突然止まって利用者が困ることになります。特に配布・共有するマクロには最低限のエラー処理を入れることをおすすめします。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



