タイトル: エラー一覧
SEOタイトル: VBA 主要エラー一覧(実行時エラー番号 / 原因 / 対処法 / Err オブジェクト / On Error 構文)
| この記事の要点 |
|
VBA のエラーとは
VBA(Visual Basic for Applications)のエラーは大きくコンパイルエラー、実行時エラー、論理エラーの 3 つに分かれます。本ページでは特に頻出する実行時エラーを中心に、エラー番号・原因・対処法を一覧でまとめます。
頻出エラー番号 早見表
| 番号 | 名称 | 主な原因 |
|---|---|---|
| 3 | Return が GoSub なしで実行された | GoSub / Return の対応ミス |
| 5 | プロシージャの呼び出し、または引数が不正です | 引数の型/範囲ミス、Mid$ の負の開始位置など |
| 6 | オーバーフローしました | Integer 範囲超え(-32768 〜 32767) |
| 7 | メモリが不足しています | 巨大な配列、Variant の使いすぎ |
| 9 | インデックスが有効範囲にありません | 配列添字超え、Worksheets("存在しない") |
| 11 | 0 で除算しました | 分母が 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 し忘れた |
| 92 | For ループが初期化されていません | For を経由しないジャンプ |
| 94 | Null の使い方が不正です | 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.Clear | Err オブジェクトをリセット |
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"
デバッグの定番テクニック
| 操作 | ショートカット | 用途 |
|---|---|---|
| ステップイン | F8 | 1 行ずつ実行 |
| ブレークポイント | 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 — エラー後の処理復帰