【2026年7月最新】VBAのエラー処理完全ガイド|On Error・Resume・GoToの使い方とErrオブジェクト活用法

【2026年7月最新】VBAのエラー処理完全ガイド|On Error・Resume・GoToの使い方とErrオブジェクト活用法

「マクロを誰かに使ってもらったら、予期しないエラーで止まってしまった」「ファイルが見つからないときにマクロが途中で落ちて、データが中途半端な状態になってしまった」——VBAマクロを本格的に業務で使い始めると、エラー処理の重要性を痛感します。エラー処理は「書かなくても動くコード」を「壊れにくく、問題を特定しやすいコード」に変える必須の技術です。

この記事では、VBAのエラー処理を完全に解説します。On Error GoTo・On Error Resume Next・Resumeステートメントの使い分け・Errオブジェクトでのエラー情報取得・Select Caseによるエラー番号分岐・業務マクロでの実践パターンまで、コード例を豊富に交えて説明します。

代表菅澤 代表菅澤
弊社の経験上、業務マクロのトラブルの多くは「エラー処理が入っていない」または「エラー処理が不完全」で引き起こされます。ファイルが見つからない・シートが存在しない・型が違う——こうした予期しない状況でも「適切なメッセージを出してスムーズに処理を終了する」コードが書けると、マクロの信頼性が大幅に向上します。
✔️VBAエラーの3種類:コンパイルエラー・実行時エラー・論理エラーの違い
✔️On Error GoTo:エラー発生時の処理を専用ルーティンに切り出す書き方
✔️On Error Resume Next:特定の行のエラーを無視する使い方と危険な使い方
✔️Resume系ステートメント:エラー後にどこから処理を再開するか3パターンの使い分け
✔️Errオブジェクト:エラー番号・説明・発生源を取得してログに記録する方法
✔️業務実践パターン:ファイル操作・DB接続・外部APIなど典型的な業務エラーへの対処
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】VBAのエラー処理完全ガイド|On Error・Resume・GoToの使い方とErrオブジェクト活用法
VBAのエラー処理を完全解説。On Error GoTo・On Error Resume Next・Resume・GoTo・Errオブジェクト(Number/Description/Source)の使い方を実践コード例付きで解説。業務マクロのデバッグに必須の知識を網羅。

01 VBAエラー処理の基本概念と種類 エラーが発生する3つのタイミングとそれぞれへの対処方針

VBAのエラーには3種類あります。「コンパイルエラー」「実行時エラー」「論理エラー」です。それぞれ発生するタイミング・原因・対処方法が異なります。エラー処理(On Error文)で対処できるのは主に「実行時エラー」です。

エラーの種類発生タイミング原因例エラー処理で防げるか
コンパイルエラーマクロ実行前(コード解析時)変数名ミス・構文ミス・End Subの欠落❌ コードの修正が必要
実行時エラー(ランタイムエラー)マクロ実行中ファイル未存在・型の不一致・ゼロ除算✅ On Errorで処理可能
論理エラー(バグ)実行中(エラーメッセージなし)計算式の間違い・条件分岐のバグ❌ テスト・デバッグで発見する

📚 用語解説

実行時エラー(ランタイムエラー):VBAコードが実行中に発生するエラー。構文は正しいが「ファイルが見つからない」「データ型が不一致」「ゼロ除算」「シートが存在しない」など、実行してみないと分からない異常状態によって発生します。On Error文でキャッチして対処できます。発生するとエラーメッセージが表示され、マクロが停止します。

エラー処理を書く目的は大きく2つです。(1)エラーが発生した場合でもマクロを「適切にクリーンアップして終了」させること。(2)エラーの内容をユーザーに分かりやすく伝えること(またはログに記録すること)。この2つを意識してエラー処理を設計します。

AI鬼管理山崎 AI鬼管理山崎
エラー処理なしのマクロで最も怖いのは「中途半端な状態で止まる」ことです。ファイルを開いた後にエラーが起きてファイルが閉じられない、シートを保護解除した後に止まって保護が戻らない——こうした後処理の漏れが、データ破損やファイルのロックにつながります。
マクロ実行開始
実行時エラー
発生

型不一致・ファイル未存在等
On Error
が処理をキャッチ

GoTo or Resume
エラー処理
ルーティン実行

メッセージ表示・ログ記録
正常終了 or
リカバリ処理

02 On Error GoTo:エラー発生時にラベルへジャンプ エラー処理の基本パターン。後処理が必要な業務マクロに必須

📚 用語解説

On Error GoTo(オン・エラー・ゴートゥ):VBAのエラー処理有効化構文。「On Error GoTo ラベル名」と書くと、以降のコードで実行時エラーが発生したとき自動的に指定ラベルへジャンプします。エラー処理ルーティンをプロシージャ末尾にラベルで配置し、通常処理の末尾にはExit Subを置くのが標準パターン。On Error GoTo 0で無効化できます。

「On Error GoTo ラベル名」は、エラーが発生したときに指定したラベルの位置にジャンプする構文です。これがVBAエラー処理の最も基本的なパターンです。エラー処理ルーティンを関数の末尾にラベル(例:ErrorHandler:)として配置し、通常の処理の末尾には「Exit Sub」を入れることで、エラーがない場合はエラー処理をスキップします。

' On Error GoToの基本パターン
Sub SampleErrorHandling()
    ' ← ここでエラー処理を有効化
    On Error GoTo ErrorHandler

    ' === 通常の処理 ===
    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\Data\report.xlsx")  ' ← ここでエラーが起きる可能性

    Cells(1, 1).Value = wb.Sheets(1).Cells(1, 1).Value
    wb.Close False

    MsgBox "処理が正常に完了しました"
    Exit Sub  ' ← エラーがない場合ここで終了(ErrorHandlerをスキップ)

' === エラー処理ルーティン ===
ErrorHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical, "エラー"
    ' 開いたファイルを閉じるなどのクリーンアップ処理
    If Not wb Is Nothing Then
        If wb.ReadOnly = False Then wb.Close False
    End If
End Sub

📚 用語解説

GoToステートメント:指定したラベルの位置に処理をジャンプさせるVBAの構文。通常はコードの可読性を下げるため多用を避けますが、エラー処理(On Error GoTo)での使用は慣用的に認められています。ラベルは「ラベル名:(コロン)」の形式で行頭に配置します。

2-1. Exit Subを忘れないことが最重要

On Error GoToパターンで最も忘れやすいのが「Exit Sub」です。通常の処理の末尾にExit Subを書かないと、エラーがなかった場合でもプログラムがそのままErrorHandlerラベルに流れ込んでしまいます。「なぜかエラーメッセージが出るのにデバッグしても問題が見つからない」という場合、Exit Subの書き忘れが原因のことがあります。

' Exit Subがないと問題になる例
Sub BadExample()
    On Error GoTo ErrorHandler

    MsgBox "正常処理"
    ' ← Exit Subがない!
    ' 正常に終わっても次の行に進んでしまう

ErrorHandler:
    MsgBox "エラー"  ' ← 正常時もここが実行されてしまう!
End Sub

' ===
Sub GoodExample()
    On Error GoTo ErrorHandler

    MsgBox "正常処理"
    Exit Sub  ' ← 必ずExit SubでErrorHandlerをスキップ

ErrorHandler:
    MsgBox "エラー"  ' ← エラー時だけ実行される
End Sub
代表菅澤 代表菅澤
ErrorHandlerの前に必ずExit Subを書く——これはVBAエラー処理の「鉄則」です。テンプレートとして覚えておくことで、書き忘れを防げます。「On Error GoTo ErrorHandler」で始まり「Exit Sub / ErrorHandler: / エラー処理」で終わるパターンをセットで覚えてください。

03 On Error Resume Next:エラーを無視して次の行へ 使いどころと危険な使い方、正しい使用パターン

📚 用語解説

On Error Resume Next:エラーが発生しても処理を停止せず次の行から実行を続ける構文。ループ処理での行スキップ・オブジェクト存在確認・任意処理など、特定の行のエラーを意図的に無視したい場合に使います。使い終わったら必ずOn Error GoTo 0で無効化することが鉄則です。On Error Resume Nextをプロシージャ全体に適用すると、意図しないエラーが全て無視されます。

「On Error Resume Next」は、エラーが発生しても無視して次の行から処理を続ける構文です。「エラーが出ても処理を止めたくない」場合に使いますが、誤用すると「エラーが出ていることに気づかずに処理が続く」危険なコードになります。On Error Resume Nextは、使い終わったらすぐにOn Error GoTo 0でエラー処理を無効化するか、On Error GoTo ラベルで通常のエラー処理に戻すことが重要です。

' On Error Resume Nextの使い方
Sub LoopWithErrorResumeNext()
    On Error Resume Next  ' エラー無視モード開始

    Dim i As Integer
    For i = 1 To 10
        ' 一部の行でエラーが出ても処理を継続したい
        Cells(i, 2).Value = Cells(i, 1).Value / Cells(i, 3).Value

        ' エラーが起きたかどうかをErrで確認
        If Err.Number <> 0 Then
            Cells(i, 4).Value = "計算エラー: " & Err.Description
            Err.Clear  ' エラー情報をリセット(重要!)
        End If
    Next i

    On Error GoTo 0  ' エラー無視モード終了(必須)

    MsgBox "全行処理完了"
End Sub
⚠️ On Error Resume Nextの危険な使い方

「On Error Resume Nextを書いてエラーが出なくなった」というのは、エラーを無視しているだけで問題が解決しているわけではありません。処理が途中でスキップされたり、意図しない値が設定されたりします。特に「データを保存する処理」の前にOn Error Resume Nextを書くと、エラーで失敗したデータが保存される可能性があります。On Error Resume Nextの直後は必ずErr.Numberをチェックするか、On Error GoTo 0で無効化してください。

AI鬼管理山崎 AI鬼管理山崎
On Error Resume Nextを使う典型的な正しいケースは「ファイル・シートが存在するかどうかの確認」です。If Dir(filepath) <> "" Then でファイル存在確認もできますが、On Error Resume Next + Err.Numberで確認する書き方も慣用的に使われます。
' シートの存在確認にOn Error Resume Nextを使う例
Function SheetExists(wsName As String) As Boolean
    On Error Resume Next
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(wsName)  ' 存在しない名前を指定するとエラー
    On Error GoTo 0  ' すぐに無効化

    SheetExists = Not ws Is Nothing
End Function

' 使い方
Sub TestSheetExists()
    If SheetExists("データ") Then
        MsgBox "「データ」シートが存在します"
    Else
        MsgBox "「データ」シートが見つかりません"
    End If
End Sub
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 Resume・Resume Next・Resume ラベルの使い分け エラー後の処理再開位置を3パターンで制御する

On Error GoToでエラー処理ルーティンに飛んだ後、処理を再開したい場合は「Resume」ステートメントを使います。Resumeには3つの形式があり、エラー後にどこから処理を再開するかを指定できます。

ステートメント再開位置使う場面
Resumeエラーが発生した行に戻って再実行エラーを修正・回避した後に同じ行を再試行したい場合
Resume Nextエラーが発生した行の次の行から再開エラーが起きた行をスキップして続きを実行したい場合
Resume ラベル名指定したラベルの位置から再開特定の処理ステップから再開したい場合
' Resumeで同じ行を再試行する例(ファイルロック対応)
Sub OpenWithRetry()
    Dim filePath As String
    Dim retryCount As Integer
    filePath = "C:\Data\shared_report.xlsx"
    retryCount = 0

    On Error GoTo ErrorHandler

    Dim wb As Workbook
    Set wb = Workbooks.Open(filePath)

    ' ... データ処理 ...
    wb.Close False
    Exit Sub

ErrorHandler:
    If Err.Number = 1004 And retryCount < 3 Then
        ' ファイルがロックされている可能性 → 3秒待って再試行
        retryCount = retryCount + 1
        MsgBox "ファイルが開けません。" & retryCount & "秒後に再試行します..."
        Application.Wait Now + TimeValue("00:00:03")
        Err.Clear
        Resume  ' ← エラーが発生した行(Set wb = ...)を再実行
    Else
        MsgBox "ファイルを開けませんでした: " & Err.Description, vbCritical
    End If
End Sub
' Resume Nextでエラー行をスキップして続きを処理
Sub ProcessAllSheets()
    On Error GoTo ErrorHandler

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        ' 各シートにヘッダーを設定(保護シートでエラーが出る可能性)
        ws.Cells(1, 1).Value = "処理日時"
        ws.Cells(1, 2).Value = Now()
    Next ws
    Exit Sub

ErrorHandler:
    ' 保護シートは無視して次のシートへ
    If Err.Number = 1004 Then  ' 保護エラー
        Err.Clear
        Resume Next  ' ← エラーが起きた次の行(Next ws)から再開 → 次のシートへ
    Else
        MsgBox "予期せぬエラー: " & Err.Description, vbCritical
    End If
End Sub
代表菅澤 代表菅澤
Resume(同じ行を再実行)は無限ループになるリスクがあります。再試行回数をカウントして上限を設ける(retryCount < 3 など)のが業務マクロでの鉄則です。Resume Nextは「スキップして続行」なので、スキップによってデータが欠損・不整合にならないことを確認してから使います。

05 Errオブジェクト:Number・Description・Sourceの活用 エラー情報を取得してログ記録・原因特定に活かす

Errオブジェクトは、直近に発生したエラーの情報を格納するVBA組み込みオブジェクトです。Number(エラー番号)・Description(エラーの説明文)・Source(エラーが発生した場所)の3つのプロパティが主要なものです。エラー処理ルーティンの中でこれらを参照することで、どんなエラーが発生したかを特定できます。

📚 用語解説

Errオブジェクト:VBAに組み込まれたエラー情報格納オブジェクト。エラーが発生するとNumber・Description・Sourceプロパティに情報が設定されます。Err.Clear()でエラー情報をリセットできます。エラーが発生していないときはErr.Number = 0です。On Error Resume Next使用時は処理の直後にErr.Numberをチェックしてエラーを検知します。

プロパティ内容使用例
Err.Numberエラー番号(整数)。エラーなしは0LongIf Err.Number = 11 Then(ゼロ除算)
Err.Descriptionエラーの説明文(文字列)StringMsgBox Err.Description
Err.Sourceエラーが発生したアプリケーション/プロジェクト名StringMsgBox Err.Source
Err.Clear()エラー情報をリセット(Number=0に戻す)メソッドErr.Clear(引数なし)
' Errオブジェクトで詳細なエラーログを記録する例
Sub LoggingErrorHandler()
    On Error GoTo ErrorHandler

    ' === 処理 ===
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("データ")  ' シートが存在しない場合エラー

    Dim total As Double
    total = ws.Cells(1, 1).Value / ws.Cells(1, 2).Value  ' ゼロ除算のリスク

    MsgBox "結果: " & total
    Exit Sub

ErrorHandler:
    ' エラーログをシートに記録
    Dim logWs As Worksheet
    On Error Resume Next  ' ログシート取得に失敗しても止めない
    Set logWs = ThisWorkbook.Sheets("エラーログ")
    On Error GoTo 0

    If Not logWs Is Nothing Then
        Dim nextRow As Long
        nextRow = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1
        logWs.Cells(nextRow, 1).Value = Now()           ' 日時
        logWs.Cells(nextRow, 2).Value = Err.Number      ' エラー番号
        logWs.Cells(nextRow, 3).Value = Err.Description ' エラー内容
        logWs.Cells(nextRow, 4).Value = Err.Source      ' 発生元
    End If

    ' ユーザーへのメッセージ
    MsgBox "エラーが発生しました(No." & Err.Number & ")" & vbCrLf & _
           Err.Description, vbCritical, "エラー"
End Sub
AI鬼管理山崎 AI鬼管理山崎
エラーログをシートに記録する実装は、本番稼働しているマクロで非常に有効です。後から「いつ・どんなエラーが・どこで発生したか」を追跡でき、再発防止にも役立ちます。Sheets("エラーログ")が存在しない場合にOn Error Resume Nextで対応している点もポイントです。

06 エラー番号によるSelect Case分岐 主要なVBAエラー番号一覧と分岐処理の実践パターン

Err.Numberの値をSelect Caseで分岐することで、エラーの種類ごとに異なる対処ができます。「ファイルが見つからないなら別のパスを試す」「ゼロ除算なら0をセットする」のように、エラーに応じた適切な回復処理が書けます。よく出会うVBAのエラー番号を覚えておくと、原因特定が速くなります。

エラー番号エラー内容典型的な原因
11Division by zero(ゼロ除算)分母の値がゼロ
13Type mismatch(型の不一致)文字列のセルを数値型の変数に代入
91Object variable not set(オブジェクト未設定)Set前にオブジェクト変数を使用
1004Application-defined or object-defined errorシート/セル操作の多様なエラー(最頻出)
53File not found(ファイルが見つからない)指定パスのファイルが存在しない
9Subscript out of range(添字が範囲外)存在しない配列要素やシートを参照
70Permission denied(アクセス拒否)ファイルが他のアプリで開かれている
' エラー番号でSelect Case分岐する例
Sub SmartErrorHandler()
    On Error GoTo ErrorHandler

    ' === 処理 ===
    Dim filePath As String
    filePath = "C:\Data\report.xlsx"
    Workbooks.Open filePath

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("集計")

    Dim result As Double
    result = ws.Cells(5, 3).Value / ws.Cells(5, 4).Value
    ws.Cells(5, 5).Value = result
    Exit Sub

ErrorHandler:
    Select Case Err.Number
        Case 53  ' ファイルが見つからない
            MsgBox "ファイルが見つかりません: " & filePath & vbCrLf & _
                   "ファイルが正しいフォルダにあるか確認してください", vbCritical
        Case 9   ' シートが存在しない
            MsgBox "「集計」シートが見つかりません。" & vbCrLf & _
                   "シート名を確認してください", vbExclamation
        Case 11  ' ゼロ除算
            ws.Cells(5, 5).Value = 0  ' ゼロで上書き
            MsgBox "ゼロ除算のため結果を0にしました", vbInformation
            Resume Next  ' 次の行から続ける
        Case 70  ' アクセス拒否
            MsgBox "ファイルが他のアプリで開かれています。閉じてから再実行してください", vbExclamation
        Case Else
            MsgBox "予期せぬエラー(No." & Err.Number & "): " & Err.Description, vbCritical
    End Select
End Sub
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 On Error GoTo 0:エラー処理の無効化 エラー処理の有効範囲を制御して複数箇所に対応する

「On Error GoTo 0」は、有効になっているエラー処理(On Error GoTo または On Error Resume Next)を無効化するステートメントです。このステートメントを書いた後は、エラーが発生するとVBAのデフォルト動作(エラーメッセージを表示して停止)に戻ります。On Error GoTo 0は主に「On Error Resume Nextの適用範囲を限定する」または「複数のエラー処理を段階的に使い分ける」目的で使います。

' On Error GoTo 0で適用範囲を限定する
Sub ScopedErrorHandling()
    ' ===== フェーズ1: ファイル存在確認(エラーを無視して確認のみ) =====
    Dim wb As Workbook
    On Error Resume Next
    Set wb = Workbooks.Open("C:\Data\optional.xlsx")
    On Error GoTo 0  ' ← ここで無効化(これ以降は通常のエラー検知に戻る)

    If wb Is Nothing Then
        MsgBox "optionalファイルなし - スキップします"
    Else
        ' ===== フェーズ2: ファイルが存在する場合の処理(エラーはしっかり検知) =====
        On Error GoTo ProcessError
        Dim ws As Worksheet
        Set ws = wb.Sheets("レポート")  ' ここでエラーが出たらProcessErrorへ
        ' ... 処理 ...
        wb.Close False
        On Error GoTo 0  ' 処理完了後に無効化
    End If
    Exit Sub

ProcessError:
    MsgBox "ファイル処理中にエラー: " & Err.Description, vbCritical
    If Not wb Is Nothing Then wb.Close False
End Sub
💡 On Error GoTo 0を書き忘れると範囲外にエラー処理が漏れる

On Error Resume Nextを書いたら必ずOn Error GoTo 0でリセットする——これが鉄則です。On Error Resume Nextを書いたまま処理が進むと、意図しない箇所のエラーが全て無視されます。使い終わったらすぐにOn Error GoTo 0でリセットする習慣をつけてください。

08 業務マクロでの実践エラー処理パターン ファイル操作・一括処理・外部接続の典型的なエラー対処コード

8-1. ファイル操作のエラー処理テンプレート

' ファイル操作の標準的なエラー処理テンプレート
Sub FileOperationTemplate()
    Dim filePath As String
    Dim wb As Workbook

    filePath = "C:\Data\monthly_report.xlsx"

    On Error GoTo ErrorHandler

    ' ===== 前処理 =====
    Application.ScreenUpdating = False  ' 画面更新停止(後処理で必ず戻す)

    ' ===== メイン処理 =====
    Set wb = Workbooks.Open(filePath, ReadOnly:=False)

    ' データ処理
    wb.Sheets(1).Cells(1, 1).Value = "処理済"
    wb.Save
    wb.Close

    ' ===== 後処理(正常完了) =====
    Application.ScreenUpdating = True
    MsgBox "処理完了: " & filePath, vbInformation
    Exit Sub

' ===== エラー処理 =====
ErrorHandler:
    Dim errNum As Long
    Dim errDesc As String
    errNum = Err.Number
    errDesc = Err.Description

    ' 後処理(エラーでも必ず実行)
    Application.ScreenUpdating = True
    On Error Resume Next  ' クリーンアップ中のエラーは無視
    If Not wb Is Nothing Then wb.Close False  ' 開いたファイルを閉じる
    On Error GoTo 0

    ' ユーザーへの通知
    Select Case errNum
        Case 53
            MsgBox "ファイルが見つかりません: " & filePath, vbCritical
        Case 70
            MsgBox "ファイルが他で開かれています。閉じてから再実行してください", vbExclamation
        Case 1004
            MsgBox "ファイル操作エラー(" & errNum & "): " & errDesc, vbCritical
        Case Else
            MsgBox "エラーが発生しました(" & errNum & "): " & errDesc, vbCritical
    End Select
End Sub
代表菅澤 代表菅澤
業務マクロのエラー処理で最も重要なのは「Application.ScreenUpdatingを必ず戻す」「開いたファイルを必ず閉じる」の2点です。エラーで止まってScreenUpdatingがFalseのままだと、次にExcelを操作するとき画面が固まったように見えます。ErrorHandlerで必ず後処理を行う習慣をつけてください。

8-2. ループ処理でのエラー対処(行単位のスキップ)

' ループ内でエラーが起きた行だけをスキップして継続
Sub BulkProcessWithErrorHandling()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim errorCount As Long
    errorCount = 0

    Dim r As Long
    For r = 2 To lastRow
        On Error GoTo RowError  ' ← ループの中でOn Errorを設定し直す

        ' 処理(エラーが起きる可能性がある)
        Dim divisor As Double
        divisor = ws.Cells(r, 3).Value
        ws.Cells(r, 4).Value = ws.Cells(r, 2).Value / divisor
        ws.Cells(r, 5).Value = "OK"

        GoTo NextRow  ' ← エラーなし → ErrorHandlerをスキップ
RowError:
        ws.Cells(r, 5).Value = "ERROR: " & Err.Description
        errorCount = errorCount + 1
        Err.Clear
NextRow:
    Next r

    On Error GoTo 0  ' ループ終了後に無効化

    If errorCount > 0 Then
        MsgBox lastRow - 1 & "行中" & errorCount & "行でエラーが発生しました。" & vbCrLf & _
               "E列でエラー内容を確認してください", vbExclamation
    Else
        MsgBox "全" & lastRow - 1 & "行の処理が完了しました", vbInformation
    End If
End Sub

09 よくある失敗とデバッグのコツ エラー処理を書いたのに動かない典型的な原因と対処法

よくある失敗原因対処法
エラー処理が動かないOn Error GoTo ラベルのラベル名が一致しないラベル名とOn Error GoToの名前を完全一致させる
Exit Subを書いたのにErrorHandlerが実行されるExit Subがエラー処理ブロックの内側に書かれているExit SubはErrorHandler:ラベルの直前(外側)に書く
On Error Resume Nextの後もエラーで止まるErr.Clearを忘れてエラー状態が残っているエラー確認後にErr.Clear()を呼ぶ
エラーが発生したのにErr.Number = 0Err.Clearが先に呼ばれた・エラー処理内で別のOn Errorを使ったErr.Numberはエラー発生後すぐに変数に保存する

9-1. デバッグの実践テクニック

エラー処理のデバッグで役立つテクニックをいくつか紹介します。

✔️Debug.Printで実行状況を記録:ErrorHandler内でDebug.Print Err.Number & " - " & Err.Descriptionを追加し、イミディエイトウィンドウ(Ctrl+G)で確認する
✔️ブレークポイントを設定:エラーが出そうな行の左端をクリックしてブレークポイント(赤丸)を設定し、1行ずつ実行して変数の値を確認
✔️Err.Numberの値をMsgBoxで確認:ErrorHandler冒頭でMsgBox "ErrNo: " & Err.Numberを入れ、何番のエラーが出ているか特定する
✔️エラー後の変数を確認:ErrorHandler内でDebug.Print "wb is Nothing: " & (wb Is Nothing)のようにオブジェクト変数の状態を確認
AI鬼管理山崎 AI鬼管理山崎
エラー処理のデバッグで一番使えるのは「ErrorHandlerの最初にMsgBox Err.Number & " " & Err.Descriptionを入れる」ことです。これだけで何番のエラーが出ているかが分かり、対処方針が立てやすくなります。本番前に外せばOKです。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

10 Claude CodeでVBAエラー処理コードを自動生成 エラー処理コードの生成・デバッグ・改善をAIに任せる方法

VBAのエラー処理は「どのエラーが発生し得るか」「どう対処するか」の判断が難しく、業務マクロを堅牢にするために経験と知識が必要です。Claude Codeを使うと、「ファイルを開いて処理するマクロにエラー処理を追加して」と依頼するだけで、On Error GoToパターン・Errオブジェクト活用・クリーンアップ処理を含む堅牢なコードが生成されます。

✔️エラー処理の追加依頼:「このVBAコードにエラー処理を追加して。ファイルが見つからない場合とシートが存在しない場合は個別にメッセージを出して」
✔️エラー番号から原因調査:「VBAエラー1004が発生しました。原因と対処法を教えて」
✔️エラーログ機能の追加:「エラーが発生したときに日時・エラー番号・説明をシートに記録するように修正して」
✔️既存コードのリファクタリング:「このマクロのエラー処理を改善して。On Error Resume Nextを使いすぎているのを修正して」
代表菅澤 代表菅澤
弊社では複雑なExcel業務マクロのエラー処理設計をClaude Codeに任せています。「このマクロで発生し得るエラーを列挙して、それぞれへの対処コードを書いて」と依頼すると、経験豊富なエンジニアが設計したような堅牢なエラー処理が実装されます。特にOn Error GoTo 0とOn Error Resume Nextの使い分けを正確に判断してくれる点が優秀です。

11 まとめ VBAエラー処理の全体像と実装のポイント

この記事では、VBAのエラー処理を11セクションで体系的に解説しました。On Error GoTo・Resume・Errオブジェクト・Select Case分岐・業務実践パターンまで、エラー処理の全体像を網羅しました。

✔️エラーの3種類:コンパイル・実行時・論理の違いを理解する
✔️On Error GoTo ラベル:エラー処理の基本パターン。必ずExit Subと対にする
✔️On Error Resume Next:適用範囲を限定し、使後すぐOn Error GoTo 0でリセット
✔️Resume系:Resume(同行再実行)・Resume Next(次行へ)・Resume ラベル(指定位置へ)
✔️Errオブジェクト:Number・Description・Sourceでエラーを特定してログに記録
✔️後処理の徹底:ScreenUpdating・開いたファイル・開放すべきオブジェクトはErrorHandlerでも必ず処理
代表菅澤 代表菅澤
エラー処理は「書くのが面倒」と後回しにされがちですが、業務で他者に使ってもらうマクロでは必須です。On Error GoToの基本パターンをテンプレートとして手元に持ち、マクロを書くたびに適用する習慣をつけてください。

VBAエラー処理の設計から実装まで、Claude Codeで即解決

「マクロのエラー処理をどう書けばいいか分からない」「本番のマクロが突然止まって困っている」「エラーログの仕組みを整備したい」——弊社AI鬼管理では、Claude Codeを活用した業務VBAマクロの堅牢化・自動化支援を提供しています。

AI鬼管理山崎 AI鬼管理山崎
エラー処理を適切に設計するだけで、マクロの信頼性と保守性が大幅に向上します。まずは無料相談で、現状のマクロの課題をお聞かせください。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. On Error GoToとOn Error Resume Nextの使い分けは?

A. On Error GoToは「エラーが発生したら専用の処理ルーティンに飛ぶ」——エラーごとに異なる処理が必要、後処理(ファイルを閉じるなど)が必要な場合に使います。On Error Resume Nextは「エラーが出ても無視して次の行へ進む」——エラーがあっても続けたいループ処理・存在確認・任意処理の特定行でのみ使います。基本はOn Error GoToで、On Error Resume Nextは適用範囲を最小限に限定して使います。

Q. Exit SubとExit Functionはエラー処理でなぜ必要ですか?

A. On Error GoTo ラベルを使う場合、エラーが起きなかったときに処理が正常終了した後、そのままErrorHandlerラベルまで「流れ込む」のを防ぐために必要です。Exit Sub(またはExit Function)をErrorHandlerラベルの直前に書くことで、正常終了した場合はエラー処理を完全にスキップします。

Q. Err.Clearは何のために使いますか?

A. エラーが発生してErr.Numberに番号が入った後、次のエラー確認が正確にできるようにリセットするために使います。特にOn Error Resume Nextを使ってエラーを確認した後は、Err.Clear()を呼ばないと前のエラー情報が残ったまま次の処理に進みます。If Err.Number <> 0 Then ... Err.Clear End Ifのパターンで使います。

Q. ループ内でOn Error GoToを使う場合の注意点は?

A. ループ内でOn Error GoToを使う場合、On Error GoTo ラベルはループの中で繰り返し有効化できます(VBAのOn Error GoToはプロシージャスコープのため)。ただし「Resume Nextでループの次の反復に戻る」「GoTo NextRowのようなラベルを使う」といったパターンで明示的に次の行/次の反復に移動するコードを書く必要があります。

Q. On Error GoTo -1とOn Error GoTo 0の違いは?

A. On Error GoTo 0はエラー処理ハンドラを無効化するステートメントです。On Error GoTo -1はエラー処理の「エラーステータス(保留中のエラー)」をリセットするステートメントで、エラーハンドラ内で2重にエラーが発生した場合に使います。通常の業務マクロではOn Error GoTo 0を使えば十分で、On Error GoTo -1が必要なケースはまれです。

Q. VBAエラー処理でデバッグするコツは何ですか?

A. ErrorHandlerの冒頭にMsgBox Err.Number & ": " & Err.DescriptionとDebug.Printを両方追加することで、「どんなエラーが出ているか」が即座に分かります。また、ブレークポイント(行頭クリック→赤丸)を設定してF8キーで1行ずつ実行するステップ実行は、エラーの発生箇所の特定に最も効果的です。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月19日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。