マクロ エラー1004の原因と修正方法|実行時エラーの対処法を初心者向けに解説

マクロ エラー1004の原因と修正方法|実行時エラーの対処法を初心者向けに解説

本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。

マクロを実行したときに、突然表示される

実行時エラー ‘1004’
アプリケーション定義またはオブジェクト定義のエラーです

というメッセージ。

「何が悪いのかわからない…」
「昨日まで動いていたのに、なぜ?」

そんな経験はありませんか?

実行時エラー1004は、VBA初心者が最も遭遇しやすいエラーのひとつです。
しかし実は、このエラーの多くは

✔ シート名の指定ミス
✔ 存在しないファイルパス
✔ 開いていないブックの参照

といった “対象が存在しない” ことが原因 で発生しています。

私自身も、サーバー名変更により参照先パスが変わってしまい、久しぶりに実行したマクロが大量に1004エラーを起こした経験があります。
修正したつもりでも、どこに直書きしていたか忘れてしまい、まるで“時限爆弾”のようでした。

この記事では、

  • エラー1004の正体

  • よくある原因

  • 具体的な修正方法

  • 未然に防ぐ設計のコツ

を初心者向けにやさしく解説します。

目次

マクロ エラー1004とは?初心者でもわかる原因の基本

 実行時エラー1004とは何か?

実行時エラー1004とは、
VBAが「処理を実行できない状況」に遭遇したときに表示されるエラー です。

表示される代表的なメッセージは次の通りです。

実行時エラー ‘1004’
アプリケーション定義またはオブジェクト定義のエラーです

この文面だけを見ると、とても抽象的で分かりにくいですよね。

実はエラー1004は、
VBAの命令自体は正しいけれど、その対象が不正だった場合 に発生します。

たとえば、次のようなコードを見てみましょう。

Sub test()
Sheets("Sheet1").Name = "Sheet2" 'すでに同じ名前のシートがある状態
End Sub
このコードは文法的には正しいです。

しかし、Excelでは同じ名前のシートを作れないため、処理が失敗して 実行時エラー1004 が表示されます。

※なお、シートやブックを「存在しない名前」で呼び出した場合は、環境によって 実行時エラー9(インデックスが有効範囲にありません) が表示されることがあります。

実行時エラー1004 この名前は既に使用されていますと表示されているVBAエラー画面
既に存在するシート名を指定すると「この名前は既に使用されています」と表示されます。これは仕様上変更できないケースです。

エラー91との違い

前回の記事で解説したエラー91は、

オブジェクト変数または With ブロック変数が設定されていません

というエラーでした。

簡単に整理すると、次のようになります。

エラー番号 原因のイメージ
91 変数が Nothing(未設定)
1004 指定した対象が存在しない/実行できない

エラー91は「オブジェクトを入れるはずの変数が空(Nothing)」の状態です。
エラー1004は「対象はあるのに、仕様・状態・手順の問題でその操作が実行できない」状態と考えると分かりやすいです。


よくある表示メッセージのパターン

エラー1004は、状況によって表示内容が少し変わります。

よく見かけるパターンを整理しておきましょう。

① 「〇〇メソッドが失敗しました」

「〇〇メソッドが失敗しました」という表示は、
命令の書き方は合っているのに、実行できる状態ではなかったときによく出ます。

たとえば次のコードは、画面上で Sheet2がアクティブではないと失敗しやすい例です。

Sub test()
 Worksheets("Sheet2").Range("A1").Select 'Sheet2がアクティブでないと失敗しやすい
End Sub

この場合、
「Range クラスの Select メソッドが失敗しました」(実行時エラー1004)が出ることがあります。

実行時エラー1004 RangeクラスのSelectメソッドが失敗しましたと表示される画面
対象のシートがアクティブでない場合、Selectメソッドが失敗することがあります。
対処法①:先に対象シートをアクティブにする
Sub test()
 Worksheets("Sheet2").Activate
 Range("A1").Select
End Sub
対処法②:Selectを使わず、直接指定する(おすすめ)
Sub test()
Worksheets("Sheet2").Range("A1").Value = "OK"
End Sub
Selectは画面の状態に影響されやすく、失敗の原因になりがちです。
値の入力やコピーなどは、できるだけ 直接指定する方が安全です。

② 「アプリケーション定義またはオブジェクト定義のエラーです」

最も一般的なメッセージです。

意味としては、

「その対象に対して、その操作はできません」

ということです。

たとえば、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が発生します。

実行時エラー1004 ファイルにアクセスできませんと表示されるVBA画面
保存先フォルダが存在しない場合、SaveAsでエラー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形式など)によって、行・列の上限が異なることがあります。

実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーですと表示された画面
存在しないセル(A1の上など)を指定すると「アプリケーション定義またはオブジェクト定義のエラー」が発生します。

④ 保存先やファイルパスの問題(実体験)

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
保護状態では書き込みできません。
実行時エラー1004 保護されたシートに変更できませんと表示された画面
シートが保護されている状態で書き込みを行うとエラー1004が発生します。

まずはこの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"
C:\test フォルダが存在しなければエラーになります。

② 同名ファイルが開いている

既に開いているファイルに上書きしようとすると失敗します。

実行時エラー1004 同名ブックが現在開かれていますと表示される画面
保存しようとしているブックと同名のファイルが開いている場合もエラーになります。

③ 権限不足

共有フォルダなどで書き込み権限がない場合もエラーになります。


 別ブック参照で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
「設定(パス・ファイル名)だけをまとめる場所」を作っておくと、直す場所が1か所で済み、“時限爆弾”になりにくくなります。

エラー1004を未然に防ぐ設計のコツ

① 同じ情報は何度も書かない(1か所にまとめる)

ファイルパスやシート名をコードに何回も書くと、
変更があったときに「直し忘れ」が起きやすくなります。

そこで、よく使うパスや名前は変数や定数にまとめておくと安全です。

(例:BASE_PATH を1か所で管理する)


② いきなり操作せず、先に「あるかどうか」を確認する

ブックが開いているか、ファイルが存在するかを先に確認すると、
実行時エラーを未然に防げます。

(例:開いていなければ開く/見つからなければメッセージを出す)


③ Option Explicitで「うっかりミス」を減らす

Option Explicit を入れると、
変数名の打ち間違いをExcelが教えてくれるようになります。

初心者の方ほど、最初に入れておくのがおすすめです。

    なお、慣れてきたら「On Error」を使ったエラー処理を組み込むことで、原因特定がさらに楽になります。
    エラーハンドリングについては別記事で詳しく解説します。

    それでも解決しないときの確認方法

    ① F8キーでステップ実行

    どの行で止まるか確認します。

    ステップ実行について気になる方は、こちらの記事も参考になります。

    マクロのステップインとは?初心者でもわかるVBAのデバッグ基本操作を解説


    ② Debug.Printで値確認

    Debug.Print BASE_PATH
    変数の中身を確認できます。

    ③ 公式情報を確認する

    Microsoft Learnにも関連事例が多数掲載されています。
    環境依存の問題もあるため、参考になります。

    エラー1004は「その場しのぎ」で直すこともできますが、
    本当に減らすには VBAの基礎設計を理解すること が重要です。

    ・変数の扱い方
    ・RangeやWorkbookの正しい指定方法
    ・直書きしない設計
    ・エラーを防ぐ書き方

    をまとめて学びたい方は、こちらの記事も参考にしてみてください。

    VBAを独学で学ぶには?初心者でもわかるマクロの勉強手順とおすすめ教材


    まとめ|エラー1004は「指定ミス」から生まれる

    エラー1004は、一見すると怖いエラーですが、
    実際の原因はほとんどが

    • 存在しない対象

    • 実行できない状態

    • 環境変更

    のいずれかです。

    正しく設計し、
    管理しやすい形でマクロを書くことで
    “時限爆弾”は防げます。

    よくある質問(FAQ)

    Q1. 実行時エラー1004とは何ですか?

    実行時エラー1004とは、VBAが処理を実行できない状態になったときに表示されるエラーです。
    多くの場合、

    • 存在しないシート名を指定している

    • 開いていないブックを参照している

    • 保存先フォルダが存在しない

    など、「対象が存在しない・実行できない」ことが原因です。


    Q2. VBAのエラー1004を回避するにはどうしたらいいですか?

    次の点を意識すると予防できます。

    • シート名やパスを直書きしない

    • 定数や変数で一括管理する

    • F8でステップ実行して確認する

    • エラーハンドリングを入れる

    特に、共有フォルダやサーバー参照は変更に弱いため注意が必要です。


    Q3. シート名を変更するとエラー1004になるのはなぜですか?

    コード内でシート名を文字列で指定している場合、
    シート名を変更すると一致しなくなるためエラーが発生します。

    例:

    Worksheets("売上表").Activate

    → シート名を「売上2025」に変更するとエラーになります。

    対策としては、

    • コード名を使う

    • シート名を定数で管理する

    などの方法があります。


    Q4. SaveAsでエラー1004が出るのはなぜですか?

    主な原因は次の通りです。

    • 保存先フォルダが存在しない

    • 同名ファイルが開いている

    • 書き込み権限がない

    保存前にフォルダの存在確認を行うと安全です。

    【関連記事】

    ※外部リンク※

      ※参考書籍 (PR)

      ※本ボックスにはアフィリエイトリンク(PR)が含まれます。
      くわしくは プライバシーポリシー へ。

      マクロ エラー1004の原因と修正方法|実行時エラーの対処法を初心者向けに解説
      最新情報をチェックしよう!