【Excel VBA】実行時エラー1004の主な原因と直し方7選

【Excel VBA】実行時エラー1004の主な原因と直し方7選

記事
IT・テクノロジー
マクロを実行したら「実行時エラー '1004'」――Excel VBAでいちばんよく見かけるエラーのひとつです。
メッセージの文面は「アプリケーション定義またはオブジェクト定義のエラーです」「Rangeクラスの○○メソッドが失敗しました」などさまざまですが、原因はある程度パターンが決まっています。

この記事では、Excel VBAで業務ツールを開発・運用している立場から、1004エラーのよくある原因と直し方をまとめました。

■ まずやること:止まっている行を確認する
エラーが出たら「デバッグ」ボタンを押してください。黄色く塗られた行が、エラーで止まった行です。
その行に何が書かれているかで、下の原因のどれに当てはまるかを見当がつけられます。

━━━━━━━━━━━━━━━
原因1:アクティブでないシートのセルを Select している
━━━━━━━━━━━━━━━
▼エラーになる例
Worksheets("集計").Range("A1").Select

「集計」シートが表示されていない(アクティブでない)状態で、そのシートのセルを Select すると1004になります。

▼直し方
・そもそも Select を使わずに、直接値を書き込む
 Worksheets("集計").Range("A1").Value = 100
・どうしても選択したい場合は、先にシートを Activate する

━━━━━━━━━━━━━━━
原因2:Cells の前にシート名が付いていない
━━━━━━━━━━━━━━━
▼エラーになる例
Worksheets("明細").Range(Cells(1, 1), Cells(10, 3)).Copy

Range の前には「明細」シートを指定していますが、中の Cells にはシート名が付いていません。そのため、Cells は「今表示しているシート」のセルを指してしまい、別のシートだと1004になります。

▼直し方
With Worksheets("明細")
    .Range(.Cells(1, 1), .Cells(10, 3)).Copy
End With
(Cells の前にも「.」を付けるのがポイントです)

━━━━━━━━━━━━━━━
原因3:行番号・列番号が0やマイナスになっている
━━━━━━━━━━━━━━━
▼エラーになる例
Cells(i - 1, 1).Value = "合計" ' i が1のとき、0行目を指してしまう

最終行を求める処理の結果が想定とずれて、0行目や存在しない範囲を指しているケースもよくあります。

▼直し方
エラーで止まったときに、変数(i など)にマウスを乗せると中身が表示されます。値が0やマイナスになっていないか確認し、計算式やループの開始位置を見直します。

━━━━━━━━━━━━━━━
原因4:シートが保護されている
━━━━━━━━━━━━━━━
保護されたシートに書き込もうとすると、1004になります。

▼直し方
処理の前に保護を解除し、処理の後で保護をかけ直します。
Worksheets("入力").Unprotect Password:="パスワード"
' (書き込み処理)
Worksheets("入力").Protect Password:="パスワード"

━━━━━━━━━━━━━━━
原因5:保存先のフォルダやファイル名がおかしい
━━━━━━━━━━━━━━━
SaveAs や PDF出力(ExportAsFixedFormat)で1004が出る場合は、保存先が原因のことが多いです。
・保存先のフォルダが存在しない(フォルダ名の変更、別のPCで実行した など)
・ファイル名に使えない文字(\ / : * ? " < > |)が入っている
・同じ名前のファイルを、別の人が開いている

▼直し方
保存先のパスをイミディエイトウィンドウ(Ctrl+G)に表示して、実在するフォルダか確認します。
Debug.Print 保存先のパス

━━━━━━━━━━━━━━━
原因6:同じ名前のシートを作ろうとしている
━━━━━━━━━━━━━━━
シートをコピーして名前を付ける処理で、すでに同じ名前のシートがあると1004になります。
毎月のシートを自動で作るマクロで、2回実行したときによく起こります。

▼直し方
名前を付ける前に、同じ名前のシートがないか確認する処理を入れます。

━━━━━━━━━━━━━━━
原因7:結合セルやフィルター中の範囲に貼り付けている
━━━━━━━━━━━━━━━
コピー元とコピー先でセルの結合の形が違う場合や、フィルターで絞り込んだ範囲に貼り付ける場合も、1004になることがあります。

▼直し方
・貼り付け先の結合を解除する
・処理の前にフィルターを解除する

■ それでも直らないときは
1004エラーは原因の候補が多く、特に「他の人が作ったマクロ」「長年使っているマクロ」は、どこで何をしているのかを読み解くのに時間がかかりがちです。
・急に動かなくなった
・前任者が作ったマクロで、誰も中身が分からない
という場合は、原因の調査からお手伝いします。

▶ 動かないExcelマクロの原因を調査します(3,000円〜)
エラーが出る箇所の特定、原因の調査、軽微な修正1か所までがセットです。調査結果は「どこで・なぜ・どう直すか」をまとめてお渡しします。

▶ Excel作業をVBAマクロで自動化します(5,000円〜)
転記・集計・請求書作成など、新しく自動化したい作業のご相談はこちらから。

ご購入前のご相談も無料です。お気軽にどうぞ。
サービス数100万件のスキルマーケット、あなたにぴったりのサービスを探す