実行時エラー1004 が出たときの原因と対処(アプリケーション定義またはオブジェクト定義のエラー)

公開日:2026年10月5日 執筆:Takuya カテゴリ:エラー対処

原因が多岐にわたる実行時エラー 1004 について、よくあるパターン(存在しないセル範囲、保護されたシート、別シートのセル参照、ファイル名の問題)ごとに原因と直し方を整理します。

どんなエラーか

実行時エラー 1004 は、Excel 側の操作が失敗したときに出るエラーで、メッセージの文言は場面によって変わります。「アプリケーション定義またはオブジェクト定義のエラーです」「Range メソッドは失敗しました」など、原因が分かりにくい表示になることが多いのが特徴です。

そのため、エラー番号だけで原因を決めつけず、止まった行が何をしようとしていたかを確認するのが近道です。

よくある原因1:存在しない範囲を指定している

行番号が 0 や負の数になっている、列番号が 16384 を超えている、といった場合です。最終行の計算結果が想定外になって起きることが多いので、止まったときに変数の値を確認します(変数にマウスを重ねると値が表示されます)。

lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' データがないと lastRow は 1 になり、次の行は "A2:C1" となって想定と逆の範囲になる
If lastRow < 2 Then Exit Sub
ws.Range("A2:C" & lastRow).ClearContents

よくある原因2:別のシートのセルを指定している

シートを指定せずに Range や Cells と書くと、「今アクティブなシート」のセルとみなされます。次の書き方は、ws がアクティブでないときにエラーになります。Range の中の Cells にもシートを付けるのがポイントです。

' エラーになる例(Cells がアクティブシートを指す)
ws.Range(Cells(2, 1), Cells(10, 3)).Value = ""

' 正しい例
ws.Range(ws.Cells(2, 1), ws.Cells(10, 3)).Value = ""
' または With を使う
With ws
    .Range(.Cells(2, 1), .Cells(10, 3)).Value = ""
End With

よくある原因3:シートやブックの保護

保護されたシートのセルに値を書き込もうとしたり、行を削除しようとしたりすると、1004 のエラーになります。マクロの最初に保護を解除し、最後に保護し直すか、Protect の引数 UserInterfaceOnly:=True を使って「画面からの操作だけを禁止し、マクロからの変更は許可する」設定にします(この設定はブックを開き直すと解除されるため、ブックを開いたときのイベントで設定します)。

よくある原因4:保存・シート名・コピーの失敗

ほかにも、次のような操作で 1004 が出ます。いずれもエラーの行で何をしているかが分かれば、原因を絞り込めます。

  • SaveAs で、ファイル名に使えない記号や、存在しないフォルダを指定した
  • シート名に、使えない記号(: \ / ? * [ ])や31文字を超える名前を付けた
  • シート名を、すでにある名前に変えようとした
  • 結合セルの一部だけに値を貼り付けた、またはフィルターで絞り込んだ範囲に貼り付けた

※同じエラー番号でも原因はさまざまです。止まった行と、そのときの変数の値を必ず確認してください。

ほかの記事