実行時エラー1004 が出たときの原因と対処(アプリケーション定義またはオブジェクト定義のエラー)
原因が多岐にわたる実行時エラー 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文字を超える名前を付けた
- シート名を、すでにある名前に変えようとした
- 結合セルの一部だけに値を貼り付けた、またはフィルターで絞り込んだ範囲に貼り付けた
※同じエラー番号でも原因はさまざまです。止まった行と、そのときの変数の値を必ず確認してください。