4.

VBA 主要エラー一覧(実行時エラー番号 / 原因 / 対処法 / Err オブジェクト / On Error 構文)

編集
この記事の要点
  • VBA の実行時エラーErr.Number でエラー番号、Err.Description で説明を取得できる
  • エラー処理は On Error Resume Next(スキップ)または On Error GoTo ラベル(指定行へジャンプ)で行う
  • Error 9 (添字が有効範囲にない) / Error 13 (型が一致しない) / Error 1004 (アプリ定義/オブジェクト定義のエラー) が頻出
  • Excel オブジェクト操作のエラーは 1004 系、配列・コレクションは 9 / 5 系、データ型変換は 13 系
  • デバッグは イミディエイトウィンドウ / F8 ステップ実行 / Debug.Print が定番

VBA のエラーとは

VBA(Visual Basic for Applications)のエラーは大きくコンパイルエラー実行時エラー論理エラーの 3 つに分かれます。本ページでは特に頻出する実行時エラーを中心に、エラー番号・原因・対処法を一覧でまとめます。

頻出エラー番号 早見表

番号名称主な原因
3Return が GoSub なしで実行されたGoSub / Return の対応ミス
5プロシージャの呼び出し、または引数が不正です引数の型/範囲ミス、Mid$ の負の開始位置など
6オーバーフローしましたInteger 範囲超え(-32768 〜 32767)
7メモリが不足しています巨大な配列、Variant の使いすぎ
9インデックスが有効範囲にありません配列添字超え、Worksheets("存在しない")
110 で除算しました分母が 0
13型が一致しません文字列を数値に渡す等
20エラーがないのに Resume しましたOn Error 構文の使い方ミス
52ファイル名または番号が不正ですOpen #1 などの番号衝突
53ファイルが見つかりませんパス間違い
55ファイルは既に開かれています多重 Open
57デバイス I/O エラーですディスクや I/O 異常
58既に同名のファイルが存在していますFileCopy / Name で上書き不可
61ディスクの空き領域が不足しています書き込み失敗
62ファイルの終わりを超えましたEOF 確認不足
70書き込みできません読み取り専用、権限不足
75パス名が無効です不正な文字を含むパス
76パスが見つかりませんフォルダ不在
91オブジェクト変数または With ブロック変数が設定されていませんSet し忘れた
92For ループが初期化されていませんFor を経由しないジャンプ
94Null の使い方が不正ですNull を非対応プロパティに渡す
424オブジェクトが必要ですSet 漏れ、変数のスコープ
438オブジェクトは、このプロパティまたはメソッドをサポートしていませんスペルミス、参照ライブラリ不在
457このキーは既にコレクションの要素に割り当てられていますCollection に同一キーで追加
1004アプリケーション定義またはオブジェクト定義のエラーRange / Cells / Worksheets 操作の不整合(最頻出)

エラー処理の基本構文

On Error Resume Next(エラーを無視して次へ)

On Error Resume Next
ws.Range("A1").Value = "test"
If Err.Number <> 0 Then
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Err.Clear
End If
On Error GoTo 0   ' エラー処理を解除

On Error GoTo ラベル(指定ラベルにジャンプ)

Sub Sample()
    On Error GoTo ErrHandler

    Dim x As Integer
    x = 1 / 0   ' ゼロ除算 → Error 11

    Exit Sub
ErrHandler:
    MsgBox "Error " & Err.Number & vbCrLf & Err.Description
End Sub

Err オブジェクト

プロパティ / メソッド用途
Err.Numberエラー番号
Err.Descriptionエラーメッセージ
Err.Sourceエラー発生元の名称
Err.ClearErr オブジェクトをリセット
Err.Raise number独自のエラーを発生させる

独自エラーを発生させる

Function GetAge(birth As Date) As Integer
    If birth > Date Then
        Err.Raise vbObjectError + 1001, "GetAge", "未来の日付は無効です"
    End If
    GetAge = DateDiff("yyyy", birth, Date)
End Function

頻出エラーの原因と対処

Error 9: インデックスが有効範囲にありません

' NG: 存在しないシート
Worksheets("Sheet99").Range("A1").Value = "x"

' OK: 存在チェック
Dim ws As Worksheet
For Each ws In Worksheets
    If ws.Name = "Sheet99" Then
        ws.Range("A1").Value = "x"
        Exit For
    End If
Next

Error 13: 型が一致しません

' NG: 文字列を Integer に
Dim n As Integer
n = "abc"   ' Error 13

' OK: 数値変換できるか確認
If IsNumeric(s) Then
    n = CInt(s)
End If

Error 91: オブジェクト変数が設定されていません

' NG: Set 漏れ
Dim ws As Worksheet
ws.Range("A1").Value = "x"   ' Error 91

' OK
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A1").Value = "x"

Error 1004: アプリケーション定義/オブジェクト定義のエラー

最頻出ですが原因は多岐に渡ります。代表例:

  • 存在しないセル/シートを Range / Cells で参照
  • 保護されたシートに書き込み
  • 結合セルの一部だけ操作
  • Cells(0, 1) など 0 番を指定
  • Range("A1:A0") など無効な範囲
' NG: 保護シートに書き込み
ws.Range("A1").Value = "x"   ' Error 1004

' OK: 一時的に保護解除
ws.Unprotect Password:="pass"
ws.Range("A1").Value = "x"
ws.Protect Password:="pass"

デバッグの定番テクニック

操作ショートカット用途
ステップインF81 行ずつ実行
ブレークポイントF9指定行で停止
イミディエイトウィンドウCtrl + Gその場で式評価
ローカルウィンドウ表示 → ローカル変数の現在値
Debug.Printログ出力

エラー処理のベストプラクティス

  • On Error Resume Next を無闇に使わない — 必要最小限の範囲に絞り、終了時は On Error GoTo 0
  • エラー番号でハンドリングを分岐 — 9 / 13 / 1004 ごとに対処
  • 必ず Err.Clear する — ハンドラ後の誤検知防止
  • ログを残す — Debug.Print や別シートにエラー履歴
  • 独自エラーは vbObjectError + N で衝突を避ける

FAQ

Q: コンパイルエラーと実行時エラーの違いは?
A: コンパイルエラーは VBA エディタで赤くなる構文ミス。実行時エラーは F5 や Sub 実行時に発生する論理/データ系のエラーです。

Q: 海外環境で Error メッセージが英語
A: Err.Description が言語に依存するため、ハンドリングはErr.Number で判定するのが鉄則です。

関連

  • On Error 構文 — エラー処理の制御
  • Err オブジェクト — エラー情報
  • Debug.Print — イミディエイト出力
  • Resume / Resume Next — エラー後の処理復帰
編集
Post Share
子ページ
  1. 次の機能はマクロなしのブックに保存できません
同階層のページ
  1. マクロとボタンの紐づけ方法
  2. 開発タブの表示
  3. モジュールの名前変更方法
  4. エラー一覧
  5. シートのコピー
  6. デバッグで一行ずつ実行する方法
  7. 変数宣言時のSETありなしの違い
  8. if文で複数条件を指定する方法

最近更新/作成されたページ