【VBA入門】「実行時エラー ‘1004’」のエラー原因と対処方法とは

皆さんは、VBAで「実行時エラー ‘1004’」というエラーを見たことがありますか?

「実行時エラー ‘1004’」のエラーは、メッセージを見ただけではエラーの意味がよく分からないため、対処方法がわからず困る方も多いのではないでしょうか。

そこで今回は、

  • 「実行時エラー ‘1004’」のエラーが出る原因
  • 「実行時エラー ‘1004’」のエラーが出たときの対処方法
  • どのエラーにも使えるエラー対処方法の調べ方
  • エラー処理を使ってデバッグ画面に移動しない方法

といった基礎的なことから、応用的な方法まで、徹底的に解説します!

「実行時エラー ‘1004’」エラーがおこる原因・対処方法とは

「実行時エラー ‘1004’」エラーが起こる原因はたくさんあるので、エラーがおこるサンプルをもとに対処方法について解説します!

存在しないファイルを開こうとしたとき

1つ目は、「存在しないファイルを開こうとしたとき」です。

Workbooks.Openメソッドを使えばファイルを簡単に開くことができるのですが、存在しないファイルを指定すると以下のようにエラーが起きてしまいます。

実行フォルダ:

エラーサンプルコード:

Sub Test()

  Workbooks.Open ThisWorkbook.Path & "Test.xlsx"

End Sub

実行結果:

マクロを実行しているファイルのフォルダを「ThisWorkbook.Path」で取得し、同じフォルダ内にある「Test.xlsx」を開く処理です。

Test.xlsxファイルが同じフォルダにないため、エラーが発生しています。

このエラーは、事前にファイルの存在チェックを入れるとふせぐことができます。

Dir関数を使えば、簡単にファイルの存在チェックをすることができます。Dir関数については以下で詳しく解説しているので、気になる方は見てみてくださいね!

VBAでファイル名を取得するには?3+1のパターンで速攻理解!
更新日 : 2019年4月25日

Cellsプロパティの選択範囲に値を入れ忘れてしまったとき

2つ目は、「Cellsプロパティの選択範囲に値を入れ忘れてしまったとき」です。

Cellsプロパティを使えば、次のように簡単にセルに値を書き込むことができます。

使い方:

Cells(行番号,列番号).Value = 値

Cellsの行番号または列番号に変数を使うとき、変数に値を入れ忘れてしまうと次のようにエラーが起きてしまいます。

エラーサンプルコード:

Sub Test3()

  Dim intRow As Integer
  Dim intCol As Integer
  intRow = 1

  Worksheets("Sheet1").Cells(intRow, intCol).Value = "セル書き込み"

End Sub

実行結果:

Cellsの列番号(intCol)に値を入れ忘れたため、エラーがおきています。このエラーは、事前に変数の値を確認をしておけばふせぐことができます。

変数の値はDebug.Printまたはデバッグをして確認するのがおすすめです!

デバッグ方法・Debug.Printを使った変数の値確認方法については以下で詳しく解説しているので、気になる方は見てみてくださいね!

【ExcelVBA入門】デバッグに使うイミディエイトウィンドウとは?
更新日 : 2019年4月15日

コピー元とコピー先のセル範囲が違うとき

3つ目は、「コピー元とコピー先のセル範囲が違うとき」です。

Copyメソッドを使えば、次のように簡単にセル範囲をコピーすることができます。

Copyメソッドの使い方:

Range(コピー元のセル範囲).Copy Destination:=Range(貼り付け先のセル範囲)

ただ、貼り付け先のセルに既に値があり、コピー元のセル範囲と貼り付け先のセル範囲が違う場合は次のようなメッセージが出てきます。

処理実行前のセルデータ:

エラーサンプルコード:

Sub Test4()
  'コピー元とコピー先のセル範囲が違うとき

  '1回目 エラーが出ない
  With Worksheets("Sheet1")
    .Range("A1:A5").Copy Destination:=.Range("B1:B4")
  End With

  '2回目 エラー発生 (既に値がある場合はエラー)
  With Worksheets("Sheet1")
    .Range("A1:A5").Copy Destination:=.Range("B1:B4")
  End With


End Sub

実行後のメッセージ:

このメッセージで「いいえ」を押すと、次のようなエラーメッセージが出ます。

エラーメッセージ:

このエラーは、途中で出てくる確認メッセージを非表示にするだけで、簡単に対処することができます。

対処後のコード:

Sub Test4()
  'コピー元とコピー先のセル範囲が違うとき

  '1回目 エラーが出ない
  With Worksheets("Sheet1")
    Application.DisplayAlerts = False 'メッセージ非表示
    .Range("A1:A5").Copy Destination:=.Range("B1:B4")
    Application.DisplayAlerts = True  'メッセージ再表示
  End With

   '2回目 エラー発生 (既に値がある場合はエラー)
  With Worksheets("Sheet1")
    Application.DisplayAlerts = False 'メッセージ非表示
    .Range("A1:A5").Copy Destination:=.Range("B1:B4")
    Application.DisplayAlerts = True  'メッセージ再表示
  End With

End Sub

処理の実行直前で「Aplication.DisplayAlerts」をFalseにして非表示、処理後にTrueにしてメッセージ表示にしています。

「Aplication.DisplayAlerts」の使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!

【ExcelVBA入門】DisplayAlertsプロパティでメッセージを制御する方法とは
更新日 : 2019年5月21日

アクティブになっていないシートのセルを選択したとき

4つ目は、「アクティブになっていないシートのセルを選択したとき」です。

次のようにアクティブにしていないシートのセルを選択した場合、エラーが起こります。

エラーサンプルコード:

Sub Test1()
  Worksheets("Sheet1").Active
  Worksheets("Sheet2").Range("A1").Select
End Sub

実行結果:

このサンプルではSheet1シートをアクティブにした後、Sheet2シートのA1セルを選択しようとしているためエラーがおきています。

このエラーは、現在アクティブになっているシートが確認できれば、エラーを回避できます。

アクティブシートの名前は「ActiveSheet.Name」で簡単に確認できるので、エラーが起きたときは確認するのがおすすめです!

ちなみに、アクティブシートの取得・操作方法については以下記事で詳しくまとめているので、気になる方は見てみてくださいね!

【ExcelVBA入門】アクティブシートの取得・操作方法について徹底解説!
更新日 : 2019年4月22日

エラーが起きたときの対処方法

表示されたメッセージにはエラー番号が載っています。

メッセージ文で検索しても見つかるときは見つかりますが、稀に起こるエラーだとメッセージ文だけでは対処方法が見つからないことがあります。

そのため、エラー番号を使って調べる癖をつけるのがおすすめです。「VBA エラー 1004 対応方法」など番号を入れてGoogle検索すると、対応方法を見つけやすいのでぜひ調べてみてくださいね。

エラー番号の場所:

補足:エラー時にデバッグ画面に移動しない方法

エラーが発生したときにVBEの画面に移動してしまうと、VBAを知らない人がツールを使っていた場合はびっくりしてしまいますよね。

自分で使うだけであればそこまで気にしなくてもいいかもしれませんが、ツールを使うことに対しての不信感にもつながってしまうので、エラー処理を入れておくのがおすすめです!

サンプルコード:

'メインの処理
Sub Main()
  Dim resultMessage As String
  resultMessage = Test

  If resultMessage <> "" Then
    MsgBox resultMessage, vbCritical
  Else
    MsgBox "処理成功", vbInformation
  End If

End Sub


'「実行時エラー 1004」が発生するエラーサンプル
Function Test() As String
On Error GoTo Test_Err
  Test = ""

  Worksheets("Sheet1").Active
  Worksheets("Sheet2").Range("A1").Select

  Exit Function

Test_Err:
  'エラー時にエラー情報を返す
  Test = "【処理エラー】" & vbCrLf & _
         "エラー番号:" & Err.Number & vbCrLf & _
         "エラーメッセージ:" & Err.Description

End Function

実行結果:

メッセージの内容はほとんど同じですが、VBEに移動せずにメッセージを表示することができます。

ちょっとしたことで使い勝手が大きく変わるので、エラー処理を入れる癖をつけるのがおすすめです。エラー処理については以下でも詳しく解説しているので、気になる方は見てみてくださいね!

【VBA入門】エラーを処理する方法(On Error、Resume、GoTo)
更新日 : 2019年4月21日

まとめ

今回は、「実行時エラー ‘1004’」のエラー例と対処方法について解説しました!

「実行時エラー」はVBAを書いているとよくおこります。

今回解説した4つの対処方法・エラー番号で対処方法を調べる方法を覚えておけば、エラーに対処しやすくなるのでおすすめです!

どれも対処方法は簡単なので、ぜひ試してみてくださいね!

\業界最安級/
月額2,980円のプログラミングスクール

✔ 業界最安値の月定額2,980円
✔ 「Q&A掲示板」で平均30分以内に回答がもらえる
✔ 月に一度の「オンライン相談」で悩みを解決
✔ 教材の数は30種類以上
✔ 入会金不要+いつでも退会OK

公式サイトはこちら

Writer

Sanshiro Wakizaka

フリーランス

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close