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

【VBA】エラーハンドリングの基本と実務で使えるオープンエラーハンドリング徹底解説

Excel VBA は便利な自動化ツールですが、実務でマクロを運用していると必ず遭遇するのが「エラー」です。たとえば、存在しないファイルを開こうとした場合や、セルに数値以外のデータが入っている場合など、「想定外の状況」でマクロが止まってしまうことがあります。

これらのエラーを放置すると、
● 利用者が混乱する
● 途中で処理が止まる
● ファイルが壊れるリスクがある
● RPA(UiPath)と組み合わせた際にフロー全体が停止する

など、大きなトラブルにつながります。

そこで重要なのが エラーハンドリング(Error Handling) です。
VBA のエラーハンドリングを正しく使えば、エラーが発生した際に適切に処理を分岐させ、業務オペレーションに強いマクロを作成できます。

本記事では、

  • VBA のエラー処理の基本
  • On Error の仕組み
  • Err オブジェクトの使い方
  • 実務で使える「オープンエラーハンドリング」
  • 安定したマクロを作るための実務テクニック

まで体系的に解説します。

✅ 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

エラー処理の解除(初期状態に戻す)。

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


✅ 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連携では特に重要
  • 正しいエラー制御は「止まらないマクロ」を作るための鍵

エラーハンドリングを理解すると、
マクロの安定性は一気に向上し、現場で安心して運用できる品質になります。

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