本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。
マクロを実行したときに、突然表示される
実行時エラー ‘1004’
アプリケーション定義またはオブジェクト定義のエラーです
というメッセージ。
「何が悪いのかわからない…」
「昨日まで動いていたのに、なぜ?」
そんな経験はありませんか?
実行時エラー1004は、VBA初心者が最も遭遇しやすいエラーのひとつです。
しかし実は、このエラーの多くは
✔ シート名の指定ミス
✔ 存在しないファイルパス
✔ 開いていないブックの参照
といった “対象が存在しない” ことが原因 で発生しています。
私自身も、サーバー名変更により参照先パスが変わってしまい、久しぶりに実行したマクロが大量に1004エラーを起こした経験があります。
修正したつもりでも、どこに直書きしていたか忘れてしまい、まるで“時限爆弾”のようでした。
この記事では、
-
エラー1004の正体
-
よくある原因
-
具体的な修正方法
-
未然に防ぐ設計のコツ
を初心者向けにやさしく解説します。
- 1 マクロ エラー1004とは?初心者でもわかる原因の基本
- 2 マクロ エラー1004の具体的な修正方法
- 3 まとめ|エラー1004は「指定ミス」から生まれる
マクロ エラー1004とは?初心者でもわかる原因の基本
実行時エラー1004とは何か?
実行時エラー1004とは、
VBAが「処理を実行できない状況」に遭遇したときに表示されるエラー です。
表示される代表的なメッセージは次の通りです。
実行時エラー ‘1004’
アプリケーション定義またはオブジェクト定義のエラーです
この文面だけを見ると、とても抽象的で分かりにくいですよね。
実はエラー1004は、
VBAの命令自体は正しいけれど、その対象が不正だった場合 に発生します。
たとえば、次のようなコードを見てみましょう。
Sub test()
Sheets("Sheet1").Name = "Sheet2" 'すでに同じ名前のシートがある状態
End Sub
しかし、Excelでは同じ名前のシートを作れないため、処理が失敗して 実行時エラー1004 が表示されます。
※なお、シートやブックを「存在しない名前」で呼び出した場合は、環境によって 実行時エラー9(インデックスが有効範囲にありません) が表示されることがあります。

エラー91との違い
前回の記事で解説したエラー91は、
オブジェクト変数または With ブロック変数が設定されていません
というエラーでした。
簡単に整理すると、次のようになります。
| エラー番号 | 原因のイメージ |
|---|---|
| 91 | 変数が Nothing(未設定) |
| 1004 | 指定した対象が存在しない/実行できない |
エラー91は「オブジェクトを入れるはずの変数が空(Nothing)」の状態です。
エラー1004は「対象はあるのに、仕様・状態・手順の問題でその操作が実行できない」状態と考えると分かりやすいです。
よくある表示メッセージのパターン
エラー1004は、状況によって表示内容が少し変わります。
よく見かけるパターンを整理しておきましょう。
① 「〇〇メソッドが失敗しました」
「〇〇メソッドが失敗しました」という表示は、
命令の書き方は合っているのに、実行できる状態ではなかったときによく出ます。
たとえば次のコードは、画面上で Sheet2がアクティブではないと失敗しやすい例です。
Sub test()
Worksheets("Sheet2").Range("A1").Select 'Sheet2がアクティブでないと失敗しやすい
End Sub
この場合、
「Range クラスの Select メソッドが失敗しました」(実行時エラー1004)が出ることがあります。

対処法①:先に対象シートをアクティブにする
Sub test()
Worksheets("Sheet2").Activate
Range("A1").Select
End Sub
対処法②:Selectを使わず、直接指定する(おすすめ)
Sub test()
Worksheets("Sheet2").Range("A1").Value = "OK"
End Sub
値の入力やコピーなどは、できるだけ 直接指定する方が安全です。
② 「アプリケーション定義またはオブジェクト定義のエラーです」
最も一般的なメッセージです。
意味としては、
「その対象に対して、その操作はできません」
ということです。
たとえば、A1の“上”は存在しないため、次のコードはエラーになります。
Sub test()
Range("A1").Offset(-1, 0).Select 'A1の上は存在しない
End Sub
OffsetやCellsの行列番号を変数で作っている場合、
計算ミスで「存在しないセル」を指定してしまい、1004になることがあります。
特に、行番号が0以下になったり、範囲外になったりしないか注意が必要です。
※Excelのバージョンや互換モード(.xlsなど)では、行・列の上限が異なることがあります。古い形式のブックを扱う場合は、範囲指定が上限を超えていないかも確認しましょう。
※また、対象(シート名・ブック名)が「そもそも存在しない」場合は、1004ではなく 実行時エラー9 が表示されることもあります。
③ SaveAsで出るエラー
保存時の1004は検索ニーズも高く、初心者がつまずきやすいポイントです。
Sub test()
ActiveWorkbook.SaveAs "C:\test\sample.xlsx"
End Sub
-
フォルダが存在しない
-
同名ファイルが開いている
-
書き込み権限がない(共有フォルダなど)
などの理由で保存できないと、エラー1004が発生します。

④ Range関連で出るエラー
範囲外のセルを指定すると、1004が発生します。
Sub test()
Range("A1").Offset(1048576, 0).Select '最大行を超えて範囲外になる例
End Sub
※Microsoft 365など最近のExcelは最大行が1,048,576行のため、それを超える指定はエラーになります。
エラー1004が出やすい典型パターン5選
初心者の方が特に遭遇しやすいパターンをまとめました。
① 存在しないシート名を指定している
Sub test()
Worksheets("売上2023").Activate
End Sub
シート名が1文字でも違うとエラーになります。
なお、対象が「そもそも存在しない」場合は、
環境によっては 実行時エラー1004ではなく、実行時エラー9(インデックスが有効範囲にありません) が表示されることがあります。
ポイント
-
スペルミス
-
全角・半角の違い
-
末尾のスペース
は特に注意が必要です。
② 同じ名前を付けようとしている(仕様上できない操作)
Sub test()
Sheets("Sheet1").Name = "Sheet2" 'すでにSheet2が存在する
End Sub
Excelでは、同じ名前のシートを複数作ることはできません。
そのため、このような場合は 実行時エラー1004 が発生します。
これは
対象は存在しているが、仕様上その操作が許可されていない
というパターンです。
③ 範囲外のセルを指定している
Sub test()
Range("A1").Offset(-1, 0).Select
End Sub
A1の上にはセルが存在しないため、1004が発生します。
また、変数で行番号を計算している場合、
-
行番号が0以下になる
-
最大行を超える
-
列番号が範囲外になる
といったケースでもエラーになります。
※Excelのバージョンや互換モード(.xls形式など)によって、行・列の上限が異なることがあります。

④ 保存先やファイルパスの問題(実体験)
Sub test()
ActiveWorkbook.SaveAs "C:\存在しないフォルダ\sample.xlsx"
End Sub
保存先フォルダが存在しない場合、エラー1004になります。
私自身、サーバー変更で共有フォルダ名が変わっていたことに気づかず、
複数のマクロが一斉にエラーになった経験があります。
フォームをコピーして使い回していたため、
すべてのファイルを修正する羽目になりました。
久しぶりに実行して突然エラーが出ると、本当に怖いですよね。
⑤ シートが保護されている
シート保護が有効な状態でセルに値を書き込もうとすると発生します。
Sub test()
Sheets("Sheet1").Range("A1").Value = 1
End Sub
ここまでが「エラー1004の正体」です。
次章では、
具体的な修正方法と未然に防ぐ設計のコツ を解説していきます。
マクロ エラー1004の具体的な修正方法
エラー1004は原因が幅広いため、
やみくもにコードを直してもなかなか解決しません。
ここでは、初心者の方でも順番に確認できるよう
チェック手順 → パターン別対処 → 予防策 の流れで解説します。
まず確認すべきチェックリスト
エラーが出たら、まずは次の項目を確認してみましょう。
✔ ① シート名・ブック名の指定ミス
Worksheets("売上表 ").Activate
シート名が1文字でも違うとエラーになります。
ただし、ここで少し注意が必要です。
シート名やブック名が「そもそも存在しない」場合、
環境や書き方によっては 実行時エラー1004ではなく、実行時エラー9(インデックスが有効範囲にありません) が表示されることがあります。
どちらの場合でも原因は共通です。
- 名前が正しくない
- スペルミス
- 全角・半角の違い
- 末尾のスペース
まずは対象が本当に存在しているかを確認しましょう。
✔ ② ファイルパスは正しいか
-
サーバー名が変わっていないか
-
フォルダが存在するか
-
ネットワークに接続されているか
特に共有フォルダ参照は、環境変更に弱いです。
✔ ③ ブックは開いているか
Workbooks("data.xlsx").Worksheets("Sheet1").Range("A1").Value = 1
data.xlsx が開いていない場合、エラーになります。
このケースでも、状況によっては
-
実行時エラー1004
-
実行時エラー9
のいずれかが表示されることがあります。
どちらであっても本質は同じです。
「対象が見つからない/条件を満たしていない」
という状態です。
対策としては、「何かブックが開いているか」ではなく、
目的のファイルが開いているかどうかを確認する方が安全です。
必要なファイルが開いていなければ開き、
開いていればそのまま処理を続けるようにすると、エラーを防げます。
-
▼コピペOK:指定ファイルが開いているか確認するコード
-
使い方:
下の「確認用マクロ」と「関数」を、同じブックの標準モジュールに貼り付けて使います。
targetPath を自分の環境のパスに書き換えてから実行してください。Sub test() Dim targetPath As String targetPath = "C:\Users\LLc\OneDrive\Documents\Book2.xlsm" If Not IsWorkbookOpenByFullName(targetPath) Then Workbooks.Open targetPath End If Workbooks("Book2.xlsm").Worksheets(1).Range("A1").Value = "OK" End Sub確認用関数:
Function IsWorkbookOpenByFullName(ByVal fullPath As String) As Boolean Dim wb As Workbook For Each wb In Application.Workbooks If StrComp(wb.FullName, fullPath, vbTextCompare) = 0 Then IsWorkbookOpenByFullName = True Exit Function End If Next wb End Function※同じ名前のファイルが別フォルダにある場合もあるため、慣れてきたら フルパスで確認する方法がより安全です。
✔ ④ シートは保護されていないか
ActiveSheet.Range("A1").Value = 1

まずはこの4つを確認するだけで、
実はかなりの割合で解決します。
Range指定で1004が出る場合の対処法
初心者の方に多いのが、アクティブシート依存コード です。
❌ エラーが出やすい書き方
Range("A1:A10").Select
別シートが選ばれていると、意図しない動作やエラーにつながります。
対処①:どうしてもSelectするなら、Activateしてから
Worksheets("Sheet1").Activate
Range("A1:A10").Select
対処②:可能ならSelectを使わず、直接指定(おすすめ)
Worksheets("Sheet1").Range("A1:A10").Interior.ColorIndex = 6
「値の代入」「コピー」「色付け」などは、直接指定できる場面が多いです。
Selectを減らすだけで、1004系のトラブルはかなり減ります。
SaveAsメソッドで1004が出る場合
よく検索されるのが
saveas メソッドは失敗しました
というエラーです。
原因の多くは次の3つです。
① 保存先フォルダが存在しない
ActiveWorkbook.SaveAs "C:\test\sample.xlsx"
② 同名ファイルが開いている
既に開いているファイルに上書きしようとすると失敗します。

③ 権限不足
共有フォルダなどで書き込み権限がない場合もエラーになります。
別ブック参照で1004が出る場合(実体験)
私が実際に苦労したのが、このパターンです。
Workbooks.Open "\\Server01\共有\data.xlsx"
開けずにエラー1004が発生しました。
しかもそのパスを複数ファイルに直書きしていたため、
すべて修正する必要がありました。
まさに“時限爆弾”です。
改善策:パスを一括管理する
共有フォルダやサーバー名は変更されることがあります。
そのたびにコード内のパスを探して直すのは大変なので、パスやファイル名は1か所にまとめるのがおすすめです。
たとえば、標準モジュールに「設定専用の場所(modConfig)」を作っておくと、別のモジュールからでも同じ設定を使い回せます。
-
▼設定を1か所にまとめる例(modConfig)
-
標準モジュール(例:modConfig)
Option Explicit Public Const BASE_PATH As String = "\\Server02\共有\" Public Const DATA_FILE As String = "data.xlsx" Public Function DataFullPath() As String DataFullPath = BASE_PATH & DATA_FILE End Function使う側
Sub OpenData() Dim p As String p = DataFullPath() If Dir(p) = "" Then MsgBox "ファイルが見つかりません:" & p, vbExclamation Exit Sub End If Workbooks.Open p End Sub※この方法は「同じブック内」で使える管理方法です。別ブックでも使いたい場合は、同じ設定モジュールをコピーして使います。パスが複数ある場合は、用途ごとに定数(または関数)を増やして管理します。
たとえば「原紙フォルダ」「出力フォルダ」のように分けておくと、変更時に探し回らずに済みます。Public Const TEMPLATE_PATH As String = "\\Server02\共有\テンプレ\" Public Const OUTPUT_PATH As String = "\\Server02\共有\出力\" Public Function TemplateFile() As String TemplateFile = TEMPLATE_PATH & "原紙.xlsx" End Function Public Function OutputFile(ByVal yyyymmdd As String) As String OutputFile = OUTPUT_PATH & "出力_" & yyyymmdd & ".xlsx" End Function
エラー1004を未然に防ぐ設計のコツ
① 同じ情報は何度も書かない(1か所にまとめる)
ファイルパスやシート名をコードに何回も書くと、
変更があったときに「直し忘れ」が起きやすくなります。
そこで、よく使うパスや名前は変数や定数にまとめておくと安全です。
(例:BASE_PATH を1か所で管理する)
② いきなり操作せず、先に「あるかどうか」を確認する
ブックが開いているか、ファイルが存在するかを先に確認すると、
実行時エラーを未然に防げます。
(例:開いていなければ開く/見つからなければメッセージを出す)
③ Option Explicitで「うっかりミス」を減らす
Option Explicit を入れると、
変数名の打ち間違いをExcelが教えてくれるようになります。
初心者の方ほど、最初に入れておくのがおすすめです。
エラーハンドリングについては別記事で詳しく解説します。
それでも解決しないときの確認方法
① F8キーでステップ実行
どの行で止まるか確認します。
ステップ実行について気になる方は、こちらの記事も参考になります。
▶マクロのステップインとは?初心者でもわかるVBAのデバッグ基本操作を解説
② Debug.Printで値確認
Debug.Print BASE_PATH
③ 公式情報を確認する
Microsoft Learnにも関連事例が多数掲載されています。
環境依存の問題もあるため、参考になります。
エラー1004は「その場しのぎ」で直すこともできますが、
本当に減らすには VBAの基礎設計を理解すること が重要です。
・変数の扱い方
・RangeやWorkbookの正しい指定方法
・直書きしない設計
・エラーを防ぐ書き方
をまとめて学びたい方は、こちらの記事も参考にしてみてください。
まとめ|エラー1004は「指定ミス」から生まれる
エラー1004は、一見すると怖いエラーですが、
実際の原因はほとんどが
-
存在しない対象
-
実行できない状態
-
環境変更
のいずれかです。
正しく設計し、
管理しやすい形でマクロを書くことで
“時限爆弾”は防げます。
よくある質問(FAQ)
Q1. 実行時エラー1004とは何ですか?
実行時エラー1004とは、VBAが処理を実行できない状態になったときに表示されるエラーです。
多くの場合、
-
存在しないシート名を指定している
-
開いていないブックを参照している
-
保存先フォルダが存在しない
など、「対象が存在しない・実行できない」ことが原因です。
Q2. VBAのエラー1004を回避するにはどうしたらいいですか?
次の点を意識すると予防できます。
-
シート名やパスを直書きしない
-
定数や変数で一括管理する
-
F8でステップ実行して確認する
-
エラーハンドリングを入れる
特に、共有フォルダやサーバー参照は変更に弱いため注意が必要です。
Q3. シート名を変更するとエラー1004になるのはなぜですか?
コード内でシート名を文字列で指定している場合、
シート名を変更すると一致しなくなるためエラーが発生します。
例:
Worksheets("売上表").Activate
→ シート名を「売上2025」に変更するとエラーになります。
対策としては、
-
コード名を使う
-
シート名を定数で管理する
などの方法があります。
Q4. SaveAsでエラー1004が出るのはなぜですか?
主な原因は次の通りです。
-
保存先フォルダが存在しない
-
同名ファイルが開いている
-
書き込み権限がない
保存前にフォルダの存在確認を行うと安全です。
【関連記事】
- VBAで「オブジェクト変数または With ブロック変数が設定されていない」時の対処法|実行時エラー91を初心者向けに解説
- 【Excel VBA】イベントでエラーが出るときの原因と対処法まとめ|SelectionChangeとChangeの違いも解説
- VBAの書き方で失敗しないために|読みやすくて修正しやすい変数・コメント・構造のコツ
※外部リンク※
- 実行時エラー’1004’が発生します。 |Microsoft Learn
- 先月頭まで使えてたVBAで「実行時エラー’1004’」が表示される |Microsoft Learn
- VBA実行時エラー1004 アプリケーションの定義またはオブジェクトの定義エラーとなってしまいます。 |Microsoft Learn
※参考書籍 (PR)※
※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。
