エラーハンドリングの極意:VBAを「動く」から「止まらない」へ昇華させる技術
多くのVBA開発者が陥る罠がある。それは、エラーハンドリングを「バグを隠すための隠れ蓑」だと勘違いしていることだ。
`On Error Resume Next` をコードの冒頭に貼り付け、「これでエラーが出なくなった!」と喜んでいるようでは、プロフェッショナルとは呼べない。それは単に、時限爆弾を抱えたままシステムを運用しているに過ぎないからだ。
今回は、業務自動化の現場で「絶対に壊れない」堅牢なコードを構築するための、エラーハンドリングの真髄を伝授する。
—
1. エラーハンドリングの「三つの鉄則」
エラー処理の目的は「エラーを消すこと」ではない。「予期せぬ異常を検知し、安全に停止し、再開可能な状態を記録すること」だ。
鉄則1:`On Error Resume Next` は「一点突破」で使う
この命令は、特定の処理(例えば、存在するか不明なオブジェクトの削除など)においてのみ使用し、直後に必ず `On Error GoTo 0` で解除すること。広範囲に及ぶ適用は、論理的な誤りをすべて闇に葬るため、デバッグ不能なコードを生み出す最大の要因となる。
鉄則2:`On Error GoTo 0` はリセットの儀式
`On Error GoTo 0` は、それ以降のエラー処理をVBAのデフォルト(実行時エラーで停止)に戻す命令だ。これを怠ると、後続のコードで発生した重大なバグすらも握りつぶされる。
鉄則3:ログ出力なきエラー処理は「無」と同じ
エラーが発生した際、何が起きたのか(エラー番号・内容・発生箇所)をテキストファイルやシートに残さなければ、運用フェーズで原因を特定することは不可能である。
—
2. 実践的なプロダクションコード:堅牢な設計モデル
実務でそのまま使える、保守性を担保したエラーハンドリングのテンプレートを提示する。この構造をベースにすれば、どんな処理も一貫した品質で記述できる。
‘ 業務自動化ツールの標準テンプレート
Public Sub ProcessDataExample()
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ — メイン処理開始 —
‘ ここでファイルI/OやDB連携を行う
Debug.Print “処理開始…”
‘ 特定箇所での一時的な無視(例:シートが存在しない場合のみ作成)
On Error Resume Next
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(“Log”)
On Error GoTo ErrorHandler ‘ 直ちに解除
‘ ここでメインのロジックを展開
‘ …
ExitPoint:
‘ 終了処理(DBのクローズ、画面更新の再開など)
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
‘ エラーログの記録と通知
Call WriteErrorLog(Err.Number, Err.Description, “ProcessDataExample”)
MsgBox “予期せぬエラーが発生しました。詳細はログを確認してください。”, vbCritical
Resume ExitPoint
End Sub
‘ ログ出力用の共通モジュール
Private Sub WriteErrorLog(ByVal errNum As Long, ByVal errDesc As String, ByVal procName As String)
Dim logPath As String
logPath = ThisWorkbook.Path & “\error_log.txt”
Dim fileNo As Integer
fileNo = FreeFile
Open logPath For Append As #fileNo
Print #fileNo, Now & ” | Procedure: ” & procName & ” | Err: ” & errNum & ” | Msg: ” & errDesc
Close #fileNo
End Sub
—
3. なぜこの設計が「最強」なのか
1. `ExitPoint` を設ける理由
処理の成功・失敗に関わらず、必ず通る「出口」を作ることで、画面更新の停止やトランザクションの解除といった、クリーンアップ処理の重複記述を排除できる。
2. `Resume ExitPoint` の重要性
`ErrorHandler` 内で `Resume` を使うことで、エラー発生後に必ず終了処理(`ExitPoint`)を経由させることが可能だ。これにより、Excelが「計算中」のままフリーズするような事態を確実に防げる。
3. 保守性の担保
エラーが発生した瞬間に、どのプロシージャで何が起きたのかがログに出力される。ユーザーから「動かない」と報告を受けたとき、ログファイルを見るだけで「ああ、ファイルパスの指定ミスだな」と即座に判断できる。これが、メンテナンスコストを劇的に下げる鍵となる。
—
結びに:エンジニアとしての矜持
VBAは強力だが、環境変化に弱い言語だ。ファイルが移動した、フォルダの権限が変わった、列が挿入された……現場の「予期せぬ変化」に対し、あなたの書いたコードがどう振る舞うか。
「動くコード」ではなく「壊れても正しく悲鳴を上げるコード」を書け。
エラーハンドリングを正しく実装することは、あなたの作成したツールを、単なる「使い捨てのマクロ」から「社内の基幹業務を支えるシステム」へと格上げするための、最初のステップである。
さあ、今すぐ既存のコードを見直し、その怠惰な `On Error Resume Next` を駆逐してほしい。あなたのコードは、もっと賢くなれるはずだ。
