
初めて作ったマクロを実行したら、
「実行時エラー1004」というのが出た…。
これは何?どうしたらいいの?

なるほど…。
よくわからないエラーが出た時は焦ってしまいますよね…。
でも安心してください。初心者はみんな経験しています。
では今回は、「実行時エラー1004」の原因と解決法を
VBAマクロ歴3年の私が、できるだけわかりやすく解説します。
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますのでご了承ください。
実行時エラー1004とは?(エクセルマクロ)

「実行時エラー1004」は、マクロが実行できない場合のエラーで、
構文(VBAコード)やファイル設定に原因がある場合が多いです。
今回は初心者がやってしまいがちなパターンに絞って解説いたします。
実行時エラー1004の原因と解決策
主な原因は以下の3つです。
- セル指定ミス
- 存在しないフォルダやファイルを操作した
- 保護されたシートを編集した
セル指定ミス

Sub エラー1004_1()
Range(A1).Value = 1 '実行時エラー1004が発生
End Sub
上記コードを実行すると、「実行時エラー1004」が発生します。
原因としては、指定するセル(A1)を「”(ダブルクォーテーション)」で囲っていないからです。
初心者が一番やってしまいがちなミスで、私も経験しています。
解決法は簡単で、下記のとおり指定するセルを「”」で囲うだけです。
Sub エラー1004_1()
Range("A1").Value = 1
End Sub
セル指定ミスの例をもう1つ紹介いたします。
下記コードをご覧ください。
Sub エラー1004_2()
Cells(0, 0).Value = 1 '実行時エラー1004が発生
End Sub
A1セルを指定したつもりですが、間違っています。
プログラミング経験者ならやってしまいがちなミスですね。
正しくは下記です。
Sub エラー1004_2()
Cells(1, 1).Value = 1
End Sub
セルの行番号・列番号は「0」から始まるのではなく、「1」から始まることを覚えておいてください。
また下記のように、変数を宣言して代入を忘れていた場合も「実行時エラー1004」が発生します。
Sub エラー1004_3()
Dim col As Integer
Dim row As Integer
Cells(col, row).Value = 1 '実行時エラー1004が発生
End Sub
int型の変数は、宣言した段階で「0」が代入されています。
その変数をそのまま使用すると、セル(0,0)を指定することになるため起こるエラーです。
下記のように、代入を忘れないようにしましょう。
Sub エラー1004_3()
Dim col As Integer
Dim row As Integer
col = 1
row = 1
Cells(col, row).Value = 1
End Sub
存在しないフォルダやファイルを操作した

別のファイルを開いたり、操作しようとしたときに「実行時エラー1004」が出たときは、下記のような原因が考えられます。
- ファイル名が存在しない(削除・移動した)
- ファイル名が間違っている
- ファイルの場所が間違っている
VBAコードと、実際のファイル(場所やファイル名)を比較してみましょう。
Sub エラー1004_4()
Workbooks.Open "C:\test9999.xlsx"
End Sub
保護されたシートを編集した

保護されたシートを編集しようとすると、「実行時エラー1004」が発生します。
「校閲」→「シートの保護の解除」をクリックし、保護を解除してからマクロを実行してみてください。

実行時エラー1004を減らすには
「実行時エラー1004」の原因は構文にあることが多いとお伝えしました。
ですので、「実行時エラー1004」を減らすには自分が書いた構文を再確認することが重要です。
また、発生したエラーの原因を理解し、頭に入れておくか、メモして再発させないようにするのも大切です。
- エラーが発生
- 原因を特定・理解する(メモしておく)
- 次回、再発させないように構文をチェック
それでもエラーは完全には無くなりません。
プログラミングにエラーはつきものです。
「エラーが出たからダメ」「向いていない」という考え方は捨てましょう。
最後に
マクロ実行時に出る「エラー1004」の原因と解決策について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!