【実務・中級編】エラーハンドリングの基本形:On Error GoTo 0とResumeの正しい理解 – Excel VBA解析バイブル

スポンサーリンク

エラーハンドリングの極致:なぜ、あなたのVBAは「止まって」しまうのか?

現場で動く自動化ツールにおいて、最も許されないのは「原因不明の停止」だ。
開発者が作り上げた渾身のツールが、朝の忙しい時間に「デバッグ」のダイアログを表示して停止する。これほど現場の信頼を失う光景はない。

今回は、VBAを「単なるスクリプト」から「堅牢な業務システム」へと昇華させるためのエラーハンドリングの真髄を伝授する。巷にあふれる「とりあえずOn Error Resume Next」という無責任なコードとは決別しよう。

1. 勘違いされている「On Error」の正体

VBAのエラー制御には、大きく分けて3つのフェーズがある。これを理解せずにコードを書くことは、ブレーキのない車で高速道路を走るようなものだ。

  • `On Error GoTo [ラベル名]`: エラー発生時に指定のラベルへ「避難」させる。制御権を完全にハンドラへ移す。
  • `On Error Resume Next`: エラーを無視して次の行へ進む。「予期せぬエラーまで握り潰す」という劇薬であるため、特定の行(ファイルが存在するか確認する等)でしか使ってはならない。
  • `On Error GoTo 0`: エラー制御をリセットする。これを忘れると、予期せぬエラーが発生した際に、直前のエラーハンドラが誤作動を起こす。

なぜ「GoTo 0」が重要なのか

`GoTo 0`は、「ここからは正常なフローに戻る」という宣言だ。これをサボると、本来検知すべきバグが隠蔽され、デバッグが極めて困難になる。プロのコードは、常にエラー制御の範囲を明確に限定している。

2. 実務で「絶対に止まらない」ためのテンプレート

ファイル操作やDB連携を行うツールでは、「エラーを特定する」「ログに残す」「安全に終了する」の3つが生命線だ。以下のテンプレートをコピーして、プロジェクトの標準としてほしい。

Public Sub MasterProcess()
‘ — 初期化処理 —
On Error GoTo ErrorHandler

‘ ここにメインの業務ロジックを記述
‘ 例:Call ImportDataFromDatabase

‘ 正常終了時
GoTo Finally

ErrorHandler:
‘ — エラー発生時の処理 —
‘ 発生したエラーの情報を記録(デバッグの効率が劇的に変わる)
Debug.Print “Error Number: ” & Err.Number
Debug.Print “Error Description: ” & Err.Description

‘ ユーザーへのフィードバック
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “システムエラー”

Finally:
‘ — 終了処理(リソースの解放) —
‘ ファイルのクローズ、DB接続の切断、画面更新の再開などは必ずここで行う
Application.ScreenUpdating = True

‘ エラー制御をオフにして、標準の状態へ戻す
On Error GoTo 0
End Sub

3. 現場で生き残るための「鉄則」

① 終了処理を「Finally」に集約せよ

コードの途中で`Exit Sub`を乱用してはならない。ファイルハンドルやDB接続などのリソースを確実に解放するには、`Finally`ラベル(便宜上の名称)を作り、出口を一本化するのがアーキテクチャの基本だ。

② `Resume`の使いどころを弁える

`Resume`は、エラーを修正した後に「エラー行の直後」や「同じ行」へ戻るためにある。しかし、実務では「エラーが発生したら処理を中断し、安全に終了させる」のが正解であるケースが9割だ。`Resume`を使って強引にリカバリしようとすると、スパゲッティコードが完成する。潔く諦めて終了させる設計こそが、保守性の高いコードを生む。

③ 外部リソース連携は「事前確認」と「事後処理」

ファイルを開くときは、必ず`Dir関数`や`FileSystemObject`を用いて「ファイルが存在するか」を事前確認すること。それでも起きるエラーを`ErrorHandler`で拾う。この二段構えが、堅牢なシステムの証だ。

チーフアーキテクトからの助言

「コードが動くこと」は通過点に過ぎない。
本当に優秀なエンジニアは、「エラーが起きたときに、自分がいなくても現場の担当者が状況を把握できるコード」を書く。

`Err.Number`をログに出力し、ユーザーが「どの操作で止まったか」を明示できれば、修正コストは10分の1になる。エラーハンドリングを「面倒な作業」と捉えるな。これは、未来の自分と、あなたのツールを使う現場の人々を守るための「保険」なのだ。

今日からあなたのVBAは、ただ動くだけのコードではなく、意志を持ったプロダクトへと進化するはずだ。次のコードを書くとき、必ずこのテンプレートを思い出してほしい。

タイトルとURLをコピーしました