皆さんは、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関数については以下で詳しく解説しているので、気になる方は見てみてくださいね!
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を使った変数の値確認方法については以下で詳しく解説しているので、気になる方は見てみてくださいね!
コピー元とコピー先のセル範囲が違うとき
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」の使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!
アクティブになっていないシートのセルを選択したとき
4つ目は、「アクティブになっていないシートのセルを選択したとき」です。
次のようにアクティブにしていないシートのセルを選択した場合、エラーが起こります。
エラーサンプルコード:
Sub Test1() Worksheets("Sheet1").Active Worksheets("Sheet2").Range("A1").Select End Sub
実行結果:
このサンプルではSheet1シートをアクティブにした後、Sheet2シートのA1セルを選択しようとしているためエラーがおきています。
このエラーは、現在アクティブになっているシートが確認できれば、エラーを回避できます。
アクティブシートの名前は「ActiveSheet.Name」で簡単に確認できるので、エラーが起きたときは確認するのがおすすめです!
ちなみに、アクティブシートの取得・操作方法については以下記事で詳しくまとめているので、気になる方は見てみてくださいね!
エラーが起きたときの対処方法
表示されたメッセージにはエラー番号が載っています。
メッセージ文で検索しても見つかるときは見つかりますが、稀に起こるエラーだとメッセージ文だけでは対処方法が見つからないことがあります。
そのため、エラー番号を使って調べる癖をつけるのがおすすめです。「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に移動せずにメッセージを表示することができます。
ちょっとしたことで使い勝手が大きく変わるので、エラー処理を入れる癖をつけるのがおすすめです。エラー処理については以下でも詳しく解説しているので、気になる方は見てみてくださいね!
まとめ
今回は、「実行時エラー ‘1004’」のエラー例と対処方法について解説しました!
「実行時エラー」はVBAを書いているとよくおこります。
今回解説した4つの対処方法・エラー番号で対処方法を調べる方法を覚えておけば、エラーに対処しやすくなるのでおすすめです!
どれも対処方法は簡単なので、ぜひ試してみてくださいね!