Excel VBA は便利な自動化ツールですが、実務でマクロを運用していると必ず遭遇するのが「エラー」です。たとえば、存在しないファイルを開こうとした場合や、セルに数値以外のデータが入っている場合など、「想定外の状況」でマクロが止まってしまうことがあります。
これらのエラーを放置すると、
● 利用者が混乱する
● 途中で処理が止まる
● ファイルが壊れるリスクがある
● RPA(UiPath)と組み合わせた際にフロー全体が停止する
など、大きなトラブルにつながります。
そこで重要なのが エラーハンドリング(Error Handling) です。
VBA のエラーハンドリングを正しく使えば、エラーが発生した際に適切に処理を分岐させ、業務オペレーションに強いマクロを作成できます。
本記事では、
- VBA のエラー処理の基本
- On Error の仕組み
- Err オブジェクトの使い方
- 実務で使える「オープンエラーハンドリング」
- 安定したマクロを作るための実務テクニック
まで体系的に解説します。
目次
- ✅ VBA におけるエラーの種類と仕組み
- ・① コンパイルエラー
- ・② 実行時エラー(ランタイムエラー)
- ・③ 論理エラー
- ✅ On Error ステートメントの種類と扱い方
- ・基本のエラー処理構文
- ■ On Error Resume Next
- ■ On Error GoTo ラベル名
- ■ On Error GoTo 0
- ✅ Err オブジェクトでエラー内容を取得する
- ✅ 実務で使う「オープンエラーハンドリング」とは?
- ● オープンエラーハンドリングとは
- ✅ 実務で役立つエラー処理の典型パターン
- ● シート存在チェック
- ● ファイル存在チェック
- ● 安全なファイルオープン
- ✅ エラー処理を入れるべきタイミング
- ✅ 実務で効果が高い:Try-Catch 的パターン
- ✅ RPA(UiPath) × VBA のエラー処理で注意すべきこと
- ✅ エラー処理を書くときの注意点
- ✅ まとめ:エラーハンドリングで業務用マクロは格段に安定する
✅ VBA におけるエラーの種類と仕組み
VBA のエラーは大きく3つに分類されます。
・① コンパイルエラー
コードの文法がおかしいときに発生します。
例:If A = 1 Then の「End If」を書き忘れる
・② 実行時エラー(ランタイムエラー)
マクロの実行中に想定外の状況が起きたときに発生します。
例:存在しないシートを呼ぶ、数値を0で割る
・③ 論理エラー
コード自体は動くが、意図した結果にならない状態。
例:対象列を間違える
この中で、ハンドリングが必要なのは主に「実行時エラー」です。
✅ On Error ステートメントの種類と扱い方
・基本のエラー処理構文
VBA では On Error を使ってエラーが発生したときの動作を制御します。
■ On Error Resume Next
エラーが出ても処理を止めず、次の行へ進む。
On Error Resume Next
x = 1 / 0 'エラーだが止まらない
On Error GoTo 0 'エラー制御を解除
メリット:処理を止めずに進められる
デメリット:エラーに気づかない可能性がある
→ 実務では必ず戻り値(Err.Number)を確認すること
■ On Error GoTo ラベル名
エラー発生時、指定したラベルへジャンプする。
On Error GoTo ErrHandler
x = 1 / 0
Exit Sub
ErrHandler:
MsgBox "エラー発生:" & Err.Description
非常に強力で、構造化されたエラー処理が可能になります。
■ On Error GoTo 0
エラー処理の解除(初期状態に戻す)。
✅ Err オブジェクトでエラー内容を取得する
エラー発生後の詳細情報は Err オブジェクトに格納されます。
| プロパティ | 説明 |
|---|---|
| Err.Number | エラー番号 |
| Err.Description | エラー内容 |
| Err.Source | エラーの発生源 |
| Err.Clear | エラー情報の消去 |
例:
On Error Resume Next
x = 1 / 0
If Err.Number <> 0 Then
MsgBox Err.Description
Err.Clear
End If
Resume Next と組み合わせることで「エラーが起きたかどうか確認しながら進める」書き方が可能になります。
✅ 実務で使う「オープンエラーハンドリング」とは?
● オープンエラーハンドリングとは
ファイル操作やオブジェクト取得など
“存在しない可能性が高い処理”
を安全に実行するためのエラーチェック手法です。
代表例:
- ファイルが存在するか確認
- シートが存在するか確認
- Range が扱えるか確認
- フォルダがあるか確認
- ブックが開けるか確認
たとえばファイルを開く場合:
On Error Resume Next
Set wb = Workbooks.Open("C:\Data\売上.xlsx")
If Err.Number <> 0 Then
MsgBox "ファイルを開けませんでした。パスを確認してください。"
Err.Clear
Exit Sub
End If
On Error GoTo 0
Resume Next を使いながら、
Err をチェックして「安全に」処理を進める方法です。
実務では最も多用されるエラーハンドリングの1つです。
参考:【VBA】"value 型が一致しません"エラー(Value型)の原因と対処方法
✅ 実務で役立つエラー処理の典型パターン
● シート存在チェック
Function SheetExists(shName As String) As Boolean
On Error Resume Next
SheetExists = Not Worksheets(shName) Is Nothing
On Error GoTo 0
End Function
● ファイル存在チェック
If Dir("C:\Data\売上.xlsx") = "" Then
MsgBox "ファイルがありません。"
Exit Sub
End If
● 安全なファイルオープン
On Error Resume Next
Set wb = Workbooks.Open(path)
If Err.Number <> 0 Then
MsgBox "ファイルを開けませんでした。", vbCritical
Err.Clear
Exit Sub
End If
On Error GoTo 0
✅ エラー処理を入れるべきタイミング
- ファイルを開くとき
- シートやRangeを参照するとき
- 数値計算をするとき
- 外部データを読み取るとき
- 他アプリ(Outlook・Access)と連携するとき
- CSVやテキストを扱うとき
- ループ処理で見えない要素があるとき
業務用マクロは「想定外のケース」をいかに潰すかが重要です。
✅ 実務で効果が高い:Try-Catch 的パターン
VBAにはTry〜Catch文はありませんが、次のように書くことで近い使い方ができます。
On Error GoTo ErrTrap
' メイン処理
Call MainProcess
Exit Sub
ErrTrap:
MsgBox "エラー:" & Err.Number & vbCrLf & Err.Description
●「メイン処理」と「エラー処理」が分かれるので読みやすい
●保守性が高い
●エラー発生時の動作を統一できる
✅ RPA(UiPath) × VBA のエラー処理で注意すべきこと
UiPathでExcelを操作する場合、
VBA側のエラーが原因でフロー全体が停止 するケースがあります。
そのため:
✔ On Error Resume Next を使ってエラーを吸収する
✔ 必ず Err.Number をチェックする
✔ エラー時はメッセージボックスではなく“値返却”にする
✔ ログ用シートに書き込む
✔ RPAの TryCatch と組み合わせる
など、システム運用を見据えた設計が必要です。
✅ エラー処理を書くときの注意点
- Resume Next は多用しすぎない
- Err.Clear を忘れない
- エラー番号に応じて分岐することも可能
- 「とりあえず Resume Next」は危険
- 可能なら On Error GoTo を中心に使う
- ファイル操作や外部連携は必ずエラー処理を入れる
エラー処理は“とりあえず書く”ものではなく、
安全性を確保するための仕組みとして設計する必要があります。
✅ まとめ:エラーハンドリングで業務用マクロは格段に安定する
- エラーハンドリングは実務マクロの必須機能
- On Error Resume Next と GoTo を使い分ける
- Err オブジェクトでエラー発生を正確に検知
- オープンエラーハンドリングは実務で頻出
- ファイル・シート・外部連携では必ずエラー処理を入れる
- UiPathなどRPA連携では特に重要
- 正しいエラー制御は「止まらないマクロ」を作るための鍵
エラーハンドリングを理解すると、
マクロの安定性は一気に向上し、現場で安心して運用できる品質になります。