Excel VBA「エラー処理の極意」:その場しのぎのコードから、堅牢なシステムへ
こんにちは。業務自動化の現場で数々の「止まらないマクロ」を設計してきたエンジニアです。
皆さんが書くVBAコード。動いているときはいいけれど、「予期せぬエラーで突然落ちる」なんて経験はありませんか? 多くの初心者が陥る罠は、エラーを「とりあえず無視する」か「パニックになって止まる」かの二択です。
今日は、プロの現場で必須となる「エラーハンドリングの真髄」を伝授します。これを知れば、あなたのコードは格段に洗練され、自信を持って他人に渡せる「プロダクト」へと昇華します。
—
1. エラーハンドリングの「二大原則」
VBAのエラー処理において、避けるべきは「思考停止」です。まずは基本の二つを整理しましょう。
① `On Error Resume Next`:悪魔の誘惑と賢い使い道
「エラーが出ても次へ進め」という命令です。これを安易にコードの先頭に書くのはNG。原因が隠蔽され、デバッグが不可能になるからです。
正しい使い道: 「エラーが起きるのが前提のピンポイントな操作(例:存在しないシートの削除など)」に限定して使用します。
② `On Error GoTo 0`:監視の解除
これは「エラー監視を通常モードに戻す」という命令です。エラー処理ブロックを抜けた後、必ずこれを使って「監視の網」を適切にオフにすることが、バグを防ぐ鍵になります。
—
2. 実践的なエラーハンドリング・テンプレート
プロの現場では、エラーを握りつぶすのではなく、「キャッチして、記録して、安全に終了する」のが鉄則です。以下のテンプレートをコピーして、あなたのライブラリに加えてください。
Sub RobustProcess()
‘ エラーが発生した際のジャンプ先を指定
On Error GoTo ErrorHandler
‘ — ここにメインの処理を書く —
Dim ws As Worksheet
Set ws = Worksheets(“売上データ”)
‘ (例) データがないかもしれない処理
ws.Range(“A1”).Value = 100 / 0 ‘ わざと0除算エラーを発生させる例
‘ 正常終了時はここでプロシージャを抜ける
Exit Sub
ErrorHandler:
‘ エラー発生時のログ出力と通知
MsgBox “エラーが発生しました。” & vbCrLf & _
“番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical
‘ ログファイルへの書き出し等をここで行う(実務では必須)
‘ WriteLog “Error ” & Err.Number & “: ” & Err.Description
‘ エラー処理終了後に監視を解除
On Error GoTo 0
End Sub
—
3. 「どこで、どう使う?」状況別フローチャート
初心者のうちは、以下の基準で使い分けてみてください。
| 状況 | 推奨される戦略 | 理由 |
| :— | :— | :— |
| 特定の1行でエラーが起きる可能性がある | `Resume Next` | 処理の全停止を防ぐため |
| 予測不能なシステムエラーを防ぎたい | `GoTo ErrorHandler` | 異常終了時の後始末をするため |
| 一時的にエラーを無視した直後 | `On Error GoTo 0` | 以降の予期せぬエラーを見逃さないため |
注意:`Resume Next` を使った後の鉄則
`Resume Next` を使った後は、必ず「本当にエラーが起きたのか?」を `Err.Number` で確認しましょう。
On Error Resume Next
Set myRange = Range(“名前定義_存在しない”)
On Error GoTo 0 ‘ 即座に監視を戻す!
If myRange Is Nothing Then
MsgBox “対象範囲が見つかりません。処理を中断します。”
Exit Sub
End If
—
4. 最後に:なぜ「ログ」を取るのか
なぜ、単にメッセージボックスを出すだけでなく、ログ出力まで気にするのか。それは「マクロは誰が使っているかわからないから」です。
あなたがいない夜中や、離れた部署のPCでエラーが起きたとき、ただ「エラーです」と表示されても誰も助けられません。エラー番号と内容をテキストファイルに書き出しておけば、翌朝あなたが出社したとき、即座に修正に取り掛かれます。
「動くコード」を書くのはスタート地点。「止まらない、止まっても原因が分かるコード」を書くのが、真のエンジニアの仕事です。
—
今日のまとめ
1. `Resume Next` は局所的に、`GoTo 0` で確実に解除する。
2. エラーを無視するな。キャッチして、記録せよ。
3. 「正常な終了」と「異常な終了」の経路を明確に分ける。
この「守りの設計」を身につければ、あなたのVBAライフは劇的に安定します。さあ、次はどんな業務を自動化しますか? 応援していますよ!
