ネット上の解説記事の中には「On Error Resume Nextは百害あって一利なし、どんな理由があっても使うな」と極論を唱えるものもあります。しかし、VBAの言語仕様を深く理解している熟練エンジニアの視点から見ると、この「完全禁止論」もまた一つの誤解です。
なぜなら、VBAには「事前にエラーが起きるかどうかを判定する関数が用意されておらず、実際に処理を試みてエラーが出るかどうかでしか判定できないケース」が厳然として存在するからです。代表例が以下の3つの場面です。
- 特定のワークシートが存在するかどうかの判定:全シートをFor Eachループで回して名前を比較するよりも、直接シートを変数にセットできるか試す方が圧倒的に高速でコードも簡潔になります。
- SpecialCellsメソッドによる該当セルの抽出:空白セルや数式セルを検索した際、該当するセルが1つもないとVBAは強制的に「実行時エラー1004」を発生させます。
- Collectionオブジェクトへの重複なしデータ登録:既に登録されているキーを追加しようとした際のエラー(エラー457)を利用して重複除外を行う手法。
こうした場面におけるVBA例外処理の2026年最新ベストプラクティスは、全面禁止することではなく、On Error Resume Nextの範囲の絞り込み方を徹底し、ErrオブジェクトとErr.Numberの取得判定を組み合わせる「サンドイッチ構造(局所カプセル化)」を採用することです。実務でそのまま使える正しい記述パターンを見てみましょう。
Sub SafeSheetCheckSample() Dim ws As Worksheet Dim errNum As Long ' ① エラーが予測される「直前の行」で初めて有効化する On Error Resume Next Set ws = ThisWorkbook.Worksheets("2026年売上データ") errNum = Err.Number ' ② GoTo 0で消える前にエラー番号を変数へ退避(またはNothing判定) On Error GoTo 0 ' ③ 直後の行で即座に解除・リセット!(たった2行だけ挟む) ' ④ 取得した状態をもとに明確な分岐処理を行う If ws Is Nothing Then MsgBox "対象のシートが見つかりません(エラー番号: " & errNum & ")。新規作成します。", vbInformation Set ws = ThisWorkbook.Worksheets.Add ws.Name ="2026年売上データ" End If End Sub
このコードの優れた点は、エラー無視が有効になっている期間が実質的に「Set ws = ...」のわずか1行だけに限定されていることです。さらに、直後で「On Error GoTo 0」を実行する前に、エラー番号を変数(errNum)に退避させるか、オブジェクト変数(ws)が「Nothing」であるかを評価することで、確実な分岐処理を実現しています。これこそが、プロの現場で実践されている安全かつスマートな書き方です。
【プロの結論】組織心理学・共依存の視点から見出すべき教訓と向いている人の判断基準
なぜこれほど危険性が周知されているにもかかわらず、オフィス現場から「On Error Resume Next」の乱用が消えないのでしょうか。この問題を単なるプログラミング技術の不足として片付けるのではなく、日本の職場環境における組織心理学や社会学的な構造から分析すると、根深い原因が浮かび上がります。
それは、日本の組織文化に根強く残る「事なかれ主義(問題の先送り)」と、非エンジニアの上司・発注者と現場の作成者との間に生じる「不健全な共依存関係」です。「とにかく今日中にエラー画面が出ないようにして集計を通せ」と迫る管理者と、構造的な原因(元データの不備や業務フローの矛盾)を指摘する時間を与えられず、表面上の平穏を取り繕うためにエラー抑制コードを書き込んでしまう担当者。これは、家庭や組織内の歪みを外に見せないよう蓋をする機能不全の心理メカニズムや、過干渉な要求に対して境界線を引けない心理構造と酷似しています。
健全なシステムと組織運営に不可欠なのは、正常な処理と異常な状態を明確に切り分ける「バウンダリー(境界線)」の確立です。プログラムにおいて「ここから先は異常値である」と明確に線を引き、エラーが起きたら堂々と処理を止めて警告を発することは、業務全体の信頼性を守るための正当な防衛反応にほかなりません。
以上の構造を踏まえ、このステートメントを「使ってもよい人」と「絶対に使ってはいけない人」の判断基準を明確に定義します。
- 【使用が向いている人・許可される条件】
どの行で・何番の実行時エラー(Err.Number)が発生するかを事前に100%特定できており、その対象行の直前と直後を「On Error Resume Next」と「On Error GoTo 0」で厳密に挟み込み、直後にIf文でリカバリー処理を記述できる中〜上級者。 - 【使用をおすすめできない人・避けるべき条件】
「なぜエラーが出ているのか分からないが、とりあえずマクロを最後まで動かしたい」と考えている方や、プロシージャの先頭(Subの直後)に書いて最後まで解除しない書き方をしようとしている方。この場合は迷わず「On Error GoTo ラベル名」を使用するか、If文による事前チェック(Dir関数でのファイル存在確認やIsNumeric関数での数値判定など)に書き換えるべきです。