この記事で分かること
- VBAでよく出る実行時エラーの番号ごとの典型的な原因
- それぞれのエラーを再現する簡単なコード例
- エラーが出たときにまず試すべきデバッグの基本手順
「実行時エラー ‘1004’」と表示されたが、何が悪いのか見当がつかないという方に向けて書いています。
どんな場面で使うか
- 自作・引き継ぎマクロを実行したらエラーで止まった
- エラーメッセージは出るが、原因の見当がつかない
- 同じエラーが繰り返し出るので、根本原因を理解したい
基本説明
VBAの実行時エラーには「エラー番号」が割り振られています。番号ごとに原因のパターンがある程度決まっているため、番号さえ分かれば疑うべき箇所を絞り込めます。
エラーが発生すると、メッセージボックスに「実行時エラー ‘〇〇’:」という形で番号が表示されます。まずこの番号を確認することが、原因調査の第一歩です。
手順
エラー番号の確認方法
- エラーが発生したら、メッセージボックスの「実行時エラー ‘番号’:」の数字を控える
- 「デバッグ」ボタンを押すと、エラーが発生した行が黄色くハイライトされる
- 下記の一覧から該当する番号を探し、原因の候補を確認する
- ハイライトされた行の変数の値を、イミディエイトウィンドウ(
Ctrl+G)で? 変数名と入力して確認する
サンプルコードまたは例
エラー1004:オブジェクト指定の失敗
最も頻繁に出るエラーです。原因の多くは「存在しないシート名・セル範囲を指定した」ことです。
Sub Error1004_再現例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("存在しないシート名")
ws.Range("A1").Value = "テスト"
End Sub
対処:シート名のタイプミス、全角/半角の違い、シートが削除・リネームされていないかを確認します。Worksheets(1)のようにインデックス番号で指定している場合は、シートの並び順が変わっていないかも確認します。
エラー9:インデックスが有効範囲にありません
配列やコレクションで、存在しない番号・名前を指定したときに出ます。
Sub Error9_再現例()
Dim arr(1 To 5) As Long
Dim x As Long
x = arr(10) ' 配列の範囲外を指定
End Sub
対処:配列の要素数を超えて参照していないか、Worksheets(4)のように存在しないシート番号を指定していないかを確認します。
エラー13:型が一致しません
数値として扱いたい値に、文字列や空欄が混ざっているときに出ます。
Sub Error13_再現例()
Dim x As Long
x = "abc" ' 文字列を数値型の変数に代入
End Sub
対処:セルの値をそのまま数値型の変数に代入している場合、セルが空欄・文字列になっていないかを確認します。IsNumeric(セルの値)で事前にチェックすると安全です。
エラー91:オブジェクト変数またはWithブロック変数が設定されていません
Setし忘れたオブジェクト変数を使おうとしたときに出ます。
Sub Error91_再現例()
Dim ws As Worksheet
ws.Range("A1").Value = "テスト" ' Set ws = ... を忘れている
End Sub
対処:オブジェクト型の変数(Worksheet、Range、Workbookなど)は、使う前に必ずSetで代入されているか確認します。If ws Is Nothing Thenで未設定を検知できます。
エラー438:オブジェクトはこのプロパティまたはメソッドをサポートしていません
オブジェクトの種類に対して存在しないプロパティ・メソッドを呼んだときに出ます。
Sub Error438_再現例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Value = "テスト" ' Worksheetに.Valueは無い(Rangeのプロパティ)
End Sub
対処:WorksheetとRangeなど、似た名前でもプロパティ・メソッドが異なるオブジェクトを取り違えていないか確認します。
エラー53:ファイルが見つかりません
指定したパスにファイルが存在しないときに出ます。
Sub Error53_再現例()
Dim s As String
s = Dir("C:\存在しないフォルダ\存在しないファイル.csv")
Workbooks.Open "C:\存在しないフォルダ\存在しないファイル.csv"
End Sub
対処:パスのタイプミス、ファイルが移動・削除されていないか、ネットワークドライブが接続されているかを確認します。実行するPCによってパスが変わる場合は、決め打ちせずにApplication.GetOpenFilenameでユーザーに選ばせる方法(別記事のスニペット参照)も検討します。
よくあるエラー
F8ステップ実行とDebug.Printの基本
一覧で原因の見当がついても再現しない場合は、次の手順で確認します。
- エラーが出た行にカーソルを合わせ、
F9でブレークポイントを設定する F8キーで1行ずつ実行し、どの行でおかしくなるかを特定する- 気になる変数は
Debug.Print 変数名を一時的に追加し、イミディエイトウィンドウで値を確認する - 原因が分かったら
Debug.Printは削除し、必要に応じてOn Errorによるエラー処理に置き換える
「とりあえずOn Error Resume Nextでエラーを無視する」対処は、根本原因を隠してしまい後で別の不具合につながるため避けてください。
まとめ
VBAの実行時エラーは、番号ごとに原因のパターンがある程度決まっています。エラーが出たらまず番号を確認し、この記事の一覧と照らし合わせることで、闇雲に調べるより早く原因にたどり着けます。F8のステップ実行とDebug.Printを組み合わせれば、一覧にないエラーでも原因箇所を絞り込めます。
