Excel VBAで業務マクロを作成していると、
「途中でエラーが出ても、処理を止めずに最後まで終わらせたい」
「一部の失敗は許容して、全体としては正常終了させたい」
という要件に必ず直面します。
しかし一方で、
On Error Resume Next を使った結果、
- エラーに気づけない
- データが壊れたまま処理が進む
- 原因不明の不具合が後から発覚する
といった “静かに壊れるVBA” を生み出してしまうケースも非常に多いです。
この記事では、
「エラーを無視して終了する」ことを目的としたVBA設計について、
- なぜ安易な Resume Next が危険なのか
- 正しく「無視する/無視しない」を分ける方法
- 実務で使えるコード構成
- RPA(UiPath)連携を前提にした考え方
を、コード例付きで徹底的に解説します。
目次
- ✅ VBAで「エラーを無視して終了する」とはどういうことか
- ・「エラーを無視する」と「エラーを握りつぶす」は違う
- ・実務で求められる「無視して終了」の典型例
- ✅ On Error Resume Next の正しい位置づけ
- ・On Error Resume Next の基本動作
- ・Resume Next が危険と言われる理由
- ✅ エラーを無視しつつ安全に終了する基本設計
- ・基本思想:無視するのではなく「確認してから進む」
- ・最小単位で Resume Next を使う
- ✅ エラーがあっても最後まで処理を回す構成
- ・ループ内でのエラー無視パターン
- ✅ エラーを無視して「正常終了」させる方法
- ・Exit Sub を使った終了制御
- ・メッセージを出さない判断も重要
- ✅ エラーを無視して終了する設計とログの重要性
- ・最低限残すべき情報
- ✅ On Error GoTo と Resume Next の使い分け
- ・使い分けの目安
- ✅ RPA(UiPath)と組み合わせた考え方
- ✅ よくある失敗パターン
- ✅ まとめ:VBAでエラーを無視して終了する正しい考え方
✅ 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 は使うな」と言われる最大の理由です。
✅ エラーを無視しつつ安全に終了する基本設計
※ここがこの記事の最重要ポイントです。
・基本思想:無視するのではなく「確認してから進む」
正しい設計では、
- Resume Next を使う
- Err.Number を確認
- 必要なら記録・分岐
- 処理を続行 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エンジニアの分かれ目です。