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

【VBA】エラーを無視して終了する方法:エラーハンドリングの正しい設計と実務対応

Excel VBAで業務マクロを作成していると、
「途中でエラーが出ても、処理を止めずに最後まで終わらせたい
「一部の失敗は許容して、全体としては正常終了させたい
という要件に必ず直面します。

しかし一方で、
On Error Resume Next を使った結果、

  • エラーに気づけない
  • データが壊れたまま処理が進む
  • 原因不明の不具合が後から発覚する

といった “静かに壊れるVBA” を生み出してしまうケースも非常に多いです。

この記事では、
「エラーを無視して終了する」ことを目的としたVBA設計について、

  • なぜ安易な Resume Next が危険なのか
  • 正しく「無視する/無視しない」を分ける方法
  • 実務で使えるコード構成
  • RPA(UiPath)連携を前提にした考え方

を、コード例付きで徹底的に解説します。

✅ VBAで「エラーを無視して終了する」とはどういうことか

※ここを誤解すると、「止まらないけど信用できないマクロ」になります。

・「エラーを無視する」と「エラーを握りつぶす」は違う

VBAにおける
エラーを無視して終了する とは、

  • すべてのエラーを見なかったことにする
    ではありません。

本来の意味は、

  • 想定内のエラーは処理を続行
  • 致命的なエラーは把握した上で終了

という 制御されたエラーハンドリング です。


・実務で求められる「無視して終了」の典型例

実務では、以下のような場面がよくあります。

  • 一部ファイルが存在しなくても、他は処理したい
  • 空白セルがあっても、集計自体は完了させたい
  • RPAから呼ばれるため、Excel側で止まらせたくない

このような場合、
エラー=即停止 では業務が回らなくなります。


✅ On Error Resume Next の正しい位置づけ

※この理解が浅いと、VBAは一気に危険になります。

・On Error Resume Next の基本動作

On Error Resume Next は、

エラーが発生しても、次の行へ進む

という命令です。

On Error Resume Next
x = 10 / 0
MsgBox "処理は続行されます"

このコードでは、
ゼロ除算が起きても処理は止まりません。


・Resume Next が危険と言われる理由

問題は、
エラーが発生した事実が見えなくなることです。

On Error Resume Next
Set ws = Worksheets("存在しないシート")
ws.Range("A1").Value = 100

この場合、

  • シート取得に失敗
  • ws は Nothing
  • 次の行も実行される

という、
連鎖的に壊れた処理が進みます。

これが、
「Resume Next は使うな」と言われる最大の理由です。


✅ エラーを無視しつつ安全に終了する基本設計

※ここがこの記事の最重要ポイントです。

・基本思想:無視するのではなく「確認してから進む」

正しい設計では、

  1. Resume Next を使う
  2. Err.Number を確認
  3. 必要なら記録・分岐
  4. 処理を続行 or 終了

という流れを取ります。


・最小単位で Resume Next を使う

Dim ws As Worksheet

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

If ws Is Nothing Then
    ' 想定内エラー:処理をスキップ
Else
    ws.Range("A1").Value = 100
End If

このように、

  • Resume Next は 一時的に使う
  • すぐに On Error GoTo 0 で戻す

これが 安全な使い方 です。

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




✅ エラーがあっても最後まで処理を回す構成

※バッチ処理・大量データで必須の考え方です。

・ループ内でのエラー無視パターン

Dim i As Long

For i = 1 To 100
    On Error Resume Next
    Cells(i, 1).Value = 10 / Cells(i, 2).Value
    If Err.Number <> 0 Then
        ' エラーを記録
        Err.Clear
    End If
    On Error GoTo 0
Next i

この構成なら、

  • エラーが出ても次の行へ進む
  • 全体処理は最後まで完了
  • 問題箇所は把握可能

という状態を作れます。


✅ エラーを無視して「正常終了」させる方法

※止めないことと、成功扱いは別です。

・Exit Sub を使った終了制御

On Error GoTo ErrHandler

' メイン処理
Call MainProcess

Exit Sub

ErrHandler:
' ログだけ残して終了
Call WriteLog(Err.Number, Err.Description)

この場合、

  • エラーは捕捉される
  • メッセージは出さない
  • 処理は静かに終了

という 業務向け挙動 になります。


・メッセージを出さない判断も重要

RPAや夜間バッチでは、
MsgBox が出る=業務停止 です。

「何も出さずに終わる」
これも立派なエラーハンドリングです。

参考:【VBA】処理を止める「Exit」の使い方|Sub・Function・ループでの中断方法を解説


✅ エラーを無視して終了する設計とログの重要性

※「無視=記録しない」ではありません。

・最低限残すべき情報

実務では、以下だけでも残しておくと違います。

  • 日時
  • プロシージャ名
  • Err.Number
  • Err.Description
Sub WriteLog(no As Long, msg As String)
    With Sheets("Log")
        .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Value = Now
        .Cells(.Rows.Count, 2).End(xlUp).Offset(1).Value = no
        .Cells(.Rows.Count, 3).End(xlUp).Offset(1).Value = msg
    End With
End Sub

✅ On Error GoTo と Resume Next の使い分け

※両方を使える人が「分かっている人」です。

・使い分けの目安

  • 想定外・致命的 → On Error GoTo
  • 想定内・軽微 → On Error Resume Next

この線引きを 設計段階で決める ことが重要です。


✅ RPA(UiPath)と組み合わせた考え方

※Excel単体で完結しない現場では必須です。

RPAから見ると、

  • Excelが止まる → 異常
  • Excelが静かに終わる → 正常

という扱いになるケースが多いです。

そのため、

  • VBA側:エラーは内部で処理
  • RPA側:ログや戻り値で判断

という分業が現実的です。


✅ よくある失敗パターン

※ここに当てはまったら要注意です。

・最初から最後まで Resume Next

→ エラーがすべて闇に消えます。

・Err.Clear を忘れる

→ 過去のエラーを誤検知します。

・エラーを無視した理由が分からない

→ 後から誰も直せません。


✅ まとめ:VBAでエラーを無視して終了する正しい考え方

  • エラーを無視する=握りつぶす、ではない
  • Resume Next は 範囲限定で使う
  • Err.Number を必ず確認する
  • ログは残す
  • 止めない設計が必要な場面は確実に存在する

「エラーが出ないVBA」ではなく、
「エラーが出ても壊れないVBA」 を作れるかどうか。

それが、
実務で信頼されるVBAエンジニアの分かれ目です。

参考:【VBA】Descriptionプロパティとは?エラー内容を正確に扱う実務必須知識

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