【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つの対処方法・エラー番号で対処方法を調べる方法を覚えておけば、エラーに対処しやすくなるのでおすすめです!

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

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説