VBAテクニック集 VBA一覧 エラーハンドリング・処理制御 デバッグ・エラー処理

【VBA】On Error Resume Nextでエラーを無視してエラーの制御|危険な理由

Excel VBAでエラー対策を調べていると、
ほぼ必ず目にするのが次の一文です。

On Error Resume Next

一方で、この命令については

  • 「使ってはいけない」
  • 「危険だから封印すべき」
  • 「初心者が使うと事故る」

といった 否定的な意見 も非常に多く見かけます。

しかし実務の現場では、

  • オブジェクト存在チェック
  • 任意項目の取得
  • 環境差・個人差がある処理
  • RPA連携時の例外吸収

など、
On Error Resume Next が“前提”になっている処理 も数多く存在します。

つまり重要なのは、

使うか・使わないか
ではなく
どう制御して使うか

です。

この記事では、
Excel VBAにおける
On Error Resume Next を使ったエラー制御 をテーマに、

  • On Error Resume Next の正確な動作
  • 「エラーを無視する」とはどういう意味か
  • 使ってはいけないケース
  • 使うべきケース
  • 正しいスコープ管理と解除方法
  • 実務で安全に使う設計パターン

を、危険性も含めて正面から 徹底解説します。

目次

✅ On Error Resume Next とは何か

※まず誤解を正します。

・On Error Resume Next の意味

この命令は、

「エラーが発生しても、
その行で止まらず、次の行へ処理を進める」

という指示です。

On Error Resume Next
Range("A1").Select

この場合、

  • エラーが出ても
  • VBAは停止せず
  • 次の行へ進みます

・重要な誤解

On Error Resume Next は、

❌ エラーをなかったことにする
❌ エラーを解決する

ではありません。

「エラーを“発生させたまま無視する”」
これが正確な挙動です。


✅ On Error Resume Next を使うと何が起きるのか

※ここが理解できていないと危険です。

・エラーは内部的には発生している

On Error Resume Next を使っても、

  • Err.Number
  • Err.Description

ちゃんと設定されます

On Error Resume Next
Range("A1").Select
Debug.Print Err.Number

つまり、

VBAはエラーを検知している
ただし止まらない

という状態になります。


・問題は「気づかないこと」

エラーが出ても止まらないため、

  • 処理が途中で失敗
  • 値が入っていない
  • オブジェクトがNothing

といった状態でも、
そのまま処理が進行 します。

これが、

「危険」と言われる最大の理由

です。


✅ On Error Resume Next が「危険」と言われる理由

※ここを整理します。

・理由①:エラーが見えなくなる

On Error Resume Next
Range("存在しない名前").Select
  • 本来ならエラーで止まる
  • しかし止まらない
  • 開発者が異常に気づけない

・理由②:後続処理で別のエラーを誘発

On Error Resume Next
Set ws = Worksheets("NotExist")

ws.Range("A1").Value = 1
  • ws は Nothing
  • 次の行で 別のエラー が発生

原因特定が非常に困難になります。


・理由③:バグを隠蔽してしまう

  • テスト時は動いているように見える
  • 実際には処理が失敗している

最も厄介な“静かなバグ” を生みます。


✅ それでも On Error Resume Next が必要な場面

※ここが重要です。

On Error Resume Next は、
正しく使えば非常に強力な制御手段 です。


✅ 使用すべき代表的なケース①:オブジェクトの存在チェック

・典型例:シートの存在確認

Dim ws As Worksheet

On Error Resume Next
Set ws = Worksheets("Data")
On Error GoTo 0

If ws Is Nothing Then
    MsgBox "シートが存在しません"
End If

・なぜ必要か

  • 存在しないシートを参照するとエラー
  • 事前に確認する方法がない

このような 存在確認系 では、
On Error Resume Next は最適解です。


✅ 使用すべきケース②:任意項目・オプション項目の取得

・例:NamedRangeの取得

Dim rng As Range

On Error Resume Next
Set rng = Range("OptionalRange")
On Error GoTo 0
  • あれば使う
  • なければ無視する

という仕様の場合、
エラーで止める必要はありません。




✅ 使用すべきケース③:削除・解除系の処理

・例:シート削除

On Error Resume Next
Worksheets("Temp").Delete
On Error GoTo 0
  • 存在すれば削除
  • なければ何もしない

このような処理では、
On Error Resume Next が非常に有効です。


✅ 使用すべきケース④:環境差がある処理

※実務・RPAで非常に多いです。

  • アドインの有無
  • オプション設定
  • 個人環境差
On Error Resume Next
Application.CommandBars("CustomBar").Delete
On Error GoTo 0

環境依存エラーを吸収する用途 では、
積極的に使われます。


✅ 絶対に避けるべき使い方

※ここは明確にNGです。

❌ プロシージャの先頭で使いっぱなし

Sub Sample()
    On Error Resume Next

    ' 大量の処理
End Sub

全エラーが黙殺される地雷コード


❌ 原因不明エラーの回避目的

  • エラーが出る
  • 原因が分からない
  • とりあえず Resume Next

これは 最悪の対応 です。


✅ 正しい On Error Resume Next の基本ルール

※必ず守るべき原則です。

・ルール①:範囲を最小限にする

On Error Resume Next
Set ws = Worksheets("Data")
On Error GoTo 0

1〜数行に限定 するのが鉄則です。


・ルール②:必ず解除する

On Error GoTo 0

これを忘れると、
以降の処理もすべて無視されます。


・ルール③:結果を必ずチェックする

If ws Is Nothing Then
    ' エラー発生時の処理
End If

エラー無視 ≠ 成功
という前提で設計します。


✅ On Error GoTo 0 とは何か

※セットで理解が必須です。

・意味

On Error GoTo 0

は、

エラー制御を初期状態に戻す

命令です。

Resume Next を使ったら、
必ずセットで書く のが正解です。

参考:【VBA】GoToステートメントの理解と使用方法


✅ On Error Resume Next × Err オブジェクト

※中級者向けですが重要です。

・エラー番号で分岐する例

On Error Resume Next
Set ws = Worksheets("Data")

If Err.Number <> 0 Then
    MsgBox "エラー発生:" & Err.Description
End If

Err.Clear
On Error GoTo 0

これにより、

  • 無視する
  • しかし検知はする

という 高度な制御 が可能になります。


✅ On Error Resume Next を使った安全な設計テンプレート

Dim ws As Worksheet

On Error Resume Next
Set ws = Worksheets("Data")
On Error GoTo 0

If ws Is Nothing Then
    MsgBox "対象シートが存在しません"
    Exit Sub
End If

' 正常処理

この形は、
実務でそのまま使える定番パターン です。

参考:【VBA】エラー対策でマクロを有効にする方法とは|「実行できない」「止まる」を防ぐ設定と実務対応


✅ RPA(UiPath)連携時の考え方

※非常に重要です。

  • UI操作は失敗しやすい
  • 環境差が大きい
  • 例外を止めると業務が止まる

このため、

Resume Next + 状態チェック

という設計は、
RPA前提では ほぼ必須 です。


✅ よくある勘違い

※事故の原因になります。

・「Resume Next = エラー処理」

違います。制御です。

・「使ったらダメな命令」

使い方次第 です。


✅ まとめ:On Error Resume Next は「刃物」

  • 使い方を誤ると危険
  • 正しく使えば非常に便利
  • 範囲限定が最重要
  • 必ず解除する
  • 結果チェックとセット

On Error Resume Next は、

VBAが用意している
正式なエラー制御機構

です。

「怖いから使わない」
「便利だから多用する」

どちらも正解ではありません。

必要な場面で、
最小限・意図を明確にして使う

これが、
実務で信頼されるVBAを書くための
正しい付き合い方です。

ぜひこの記事を、
「On Error Resume Next を安全に使うための基準書」
として活用してください。

参考:【VBA】Application.Gotoメソッドとは:セル・範囲を移動

    -VBAテクニック集, VBA一覧, エラーハンドリング・処理制御, デバッグ・エラー処理