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 を使うと何が起きるのか
- ・エラーは内部的には発生している
- ・問題は「気づかないこと」
- ✅ On Error Resume Next が「危険」と言われる理由
- ・理由①:エラーが見えなくなる
- ・理由②:後続処理で別のエラーを誘発
- ・理由③:バグを隠蔽してしまう
- ✅ それでも On Error Resume Next が必要な場面
- ✅ 使用すべき代表的なケース①:オブジェクトの存在チェック
- ・典型例:シートの存在確認
- ・なぜ必要か
- ✅ 使用すべきケース②:任意項目・オプション項目の取得
- ・例:NamedRangeの取得
- ✅ 使用すべきケース③:削除・解除系の処理
- ・例:シート削除
- ✅ 使用すべきケース④:環境差がある処理
- ✅ 絶対に避けるべき使い方
- ❌ プロシージャの先頭で使いっぱなし
- ❌ 原因不明エラーの回避目的
- ✅ 正しい On Error Resume Next の基本ルール
- ・ルール①:範囲を最小限にする
- ・ルール②:必ず解除する
- ・ルール③:結果を必ずチェックする
- ✅ On Error GoTo 0 とは何か
- ・意味
- ✅ On Error Resume Next × Err オブジェクト
- ・エラー番号で分岐する例
- ✅ On Error Resume Next を使った安全な設計テンプレート
- ✅ RPA(UiPath)連携時の考え方
- ✅ よくある勘違い
- ・「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 を使ったら、
必ずセットで書く のが正解です。
✅ 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 を安全に使うための基準書」
として活用してください。