VBAのエラー処理を強化する方法|On Error GoTo・Err.Description・ログ出力の使い方

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.NumberErr.Description で内容を確認するのが現実的な設計です。

エラー処理を入れていないマクロは危険ですか?

自分だけが使う簡単なマクロであれば問題ないケースもありますが、他の人が使うマクロや定期実行するマクロでは、エラーが出たときに処理が突然止まって利用者が困ることになります。特に配布・共有するマクロには最低限のエラー処理を入れることをおすすめします。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール