世の中には「エラーが出た時のスクリーンショットを送ってください」と頼むエンジニアと、「エラーログを確認してください」と即座に原因を特定するエンジニアがいます。
前者はいつまでもユーザーの環境に振り回されますが、後者はシステムを掌握しています。
VBAを使いこなす第一歩は、「エラーを恐れること」ではなく、「エラーを記録して味方にすること」です。今日は、あなたの作ったマクロを「現場で勝手に育つ自律的なツール」に変える、エラーロギングの極意を伝授しましょう。
—
なぜ、あなたのVBAは「リモート環境」で死ぬのか
ユーザーのPC環境は、あなたの開発環境とは似ても似つかない「魔境」です。
- ネットワークドライブが切断されている
- ファイルが読み取り専用になっている
- シートの名前が勝手に書き換えられている
これらをいちいち電話で報告してもらうのは非効率ですよね。そこで、「エラーが起きたら、こっそりとテキストファイルに真実を書き残す」という仕組みを実装します。
—
エラーロギングの要:Errorオブジェクトを握りしめる
VBAには、エラーが発生した瞬間にその詳細を記憶する魔法のオブジェクト`Err`が存在します。これを使えば、「いつ」「どこで」「何が」起きたかを自動的に記録できます。
実装のテンプレート(コピペ用)
このコードを標準モジュールに配置し、メイン処理の最後に「出口(Exit Point)」を作るのが、プロの定石です。
Sub SampleMacro()
‘ エラーが発生したら「ErrorHandler」というラベルへ飛ぶ設定
On Error GoTo ErrorHandler
‘ — 本来の業務処理 —
Dim x As Integer
x = 1 / 0 ‘ わざと0除算エラーを発生させるテスト
‘ ——————–
‘ 正常終了時はここで終了
Exit Sub
ErrorHandler:
‘ エラー情報をログファイルに書き出す
Call WriteLog(Err.Number, Err.Description, “SampleMacro”)
MsgBox “予期せぬエラーが発生しました。詳細はログを確認してください。”, vbCritical
End Sub
‘ ログを書き出すための共通関数
Sub WriteLog(ErrNum As Long, ErrDesc As String, ProcName As String)
Dim LogFilePath As String
Dim FileNumber As Integer
‘ ログファイルの保存先(デスクトップのLogフォルダなど)
LogFilePath = Environ(“USERPROFILE”) & “\Desktop\ErrorLog.txt”
‘ 空いているファイル番号を取得
FileNumber = FreeFile
‘ 追記モード(Append)でファイルを開く
Open LogFilePath For Append As #FileNumber
‘ ログの書き込み
Print #FileNumber, “————————————”
Print #FileNumber, “発生時刻: ” & Now
Print #FileNumber, “発生箇所: ” & ProcName
Print #FileNumber, “エラー番号: ” & ErrNum
Print #FileNumber, “エラー内容: ” & ErrDesc
‘ ファイルを閉じる
Close #FileNumber
End Sub
—
このコードの本質を理解する
1. `On Error GoTo` の魔法
これは「もしエラーが起きたらパニックにならず、指定したラベル(ErrorHandler)へ逃げなさい」という命令です。これがないと、マクロは「デバッグの終了」か「強制終了」しか選択肢がなくなり、ユーザーは混乱します。
2. `Err`オブジェクトという「遺書」
エラーが発生した直後、VBAは `Err.Number`(番号)と `Err.Description`(説明)を自動的に生成します。これがエラーの正体です。この情報を握りしめたまま、別のプロシージャ(今回は`WriteLog`)にパスすることで、コードの可読性を保ちつつエラー処理を切り離せます。
3. `FreeFile` がなぜ重要か
`Open #1` と手書きしてはいけません。他のプログラムが #1 を使っているかもしれないからです。`FreeFile` を使うことで、システムが今使っていない安全なファイル番号を自動で割り当ててくれます。これは「行儀の良いプログラム」を書くための必須作法です。
—
初学者が陥りやすい罠:ここだけは注意!
- `On Error Resume Next` の乱用:
「エラーを無視する」魔法ですが、これを安易に使うと、「エラーが起きているのに動いているように見える」という最悪のバグを生みます。本当に必要な箇所(特定のファイルがないか確認する時など)以外は、原則として `GoTo ErrorHandler` を使いましょう。
- ログファイルの場所:
Cドライブの直下などは書き込み権限がないことが多いです。`Environ(“USERPROFILE”)`(ユーザーの個人フォルダ)などを活用し、必ず「書き込める場所」をターゲットにしてください。
—
さあ、次のステップへ
この仕組みを導入するだけで、あなたは「動かないマクロ」に悩まされる日々から卒業できます。エラーログが手元にあれば、あなたはユーザーに「あ、そのエラーですね。○○というファイルが消えているようです」と、まるで神のごとく即答できるようになるはずです。
VBAは、単に命令を並べるだけではありません。「いかに不測の事態を想定して、システムを壊さないか」を考えることこそが、エンジニアとしての真の成長です。
さあ、あなたのコードにこの「ログの心」を実装してみてください。それだけで、あなたの書くコードの品格は一段と高まりますよ。応援しています!
