アプリケーション定義またはオブジェクト定義のエラーです。
エラー表示
このエラーが発生すると、マクロ起動時(コンパイル時)に次のエラーが表示されます。
実行時エラー '1004'
アプリケーション定義またはオブジェクト定義のエラーです。
エラーの発生理由について
本エラーの原因はいくつか想定できます。
順を追ってみていきましょう。
ケース1:Cellsの指定ミス
Cellsを用いてありえないセルを指定してしまった時です。次のサンプルでは、xに値を代入せず、xが0の状態で(数値型の変数の初期値は0)、セルを指定した結果、エラーが発生しています。
' ケース1で本エラーが発生するサンプル
Sub TestFunc1()
Dim x as Long
MsgBox ThisWorkbook.Worksheets(1).Cells(x, 1)
End Sub
ケース2:Rangeの範囲指定ミス
セルの範囲の指定を誤った時です。下記サンプルでは、Range内にCellsを入れて範囲を指定しています。原因としては、Rangeにシートを指定しているにもかかわらず、Cellsにシートの指定をしていないことです。(Range, Cells共にシートを指定する必要があります)
' ケース2で本エラーが発生するサンプル
Sub TestFunc2()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(2)
ws.Range(Cells(1, 1), Cells(2, 2)).Font.Color _
= RGB(255, 0, 255)
Set ws = Nothing
End Sub
ケース3:Selectの範囲指定ミス
アクティブでないシートを選択してしまった時です。次のサンプルでは、アクティブでないシートを選択してしまった場合のサンプルです。Sub TestFunc3()
' アクティブでないシートを選択しようとするとエラーが発生します
Worksheets("Sheet2").Range("A2:A3").Select
End Sub
解決方法は?
ケース1の解決方法
ケース1ではCells(0, 1)を指定したことが原因でした(値を入れていない整数型の初期値は0です)。正しくセルを指定するよう変数に値を代入しましょう。
' ケース1の修正例
Sub TestFunc1()
Dim x as Long
x = 1
MsgBox ThisWorkbook.Worksheets(1).Cells(x, 1)
End Sub
ケース2の解決方法
ケース2ではRangeとそのカッコ内のCellsで異なるシート指定したことが原因でした(シートを指定していないCellsはアクティブシートを指定したことになります)。RangeとCellsで指定のシートを統一するため、Cellsにも"ws."をつけてシートを指定しましょう。
' ケース2の修正例
Sub TestFunc2()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(2)
ws.Range(ws.Cells(1, 1), ws.Cells(2, 2)).Font.Color _
= RGB(255, 0, 255)
Set ws = Nothing
End Sub
補足
ケース2は"Cells"の前のシートを"ws."で指定せず、エラー発生前にWorksheets(2)をアクティブにすることで正しく動作しますが、他のエラーを招く恐れがあるためお勧めしません。
ケース3の解決方法
ケース3ではアクティブになっていないシートを選択したことが原因でした。そのため、シートを一度アクティブにしてから、選択すれば解消します。
' ケース1の修正例
Sub TestFunc3()
' 選択する範囲があるシートをアクティブにします。
Worksheets("Sheet2").Activate
Worksheets("Sheet2").Range("A2:A3").Select
End Sub
補足
範囲選択後にアクティブなシートを元に戻したい場合は、アクティブ変更前のシート名を変数名に格納して、再びアクティブなシートを変更しましょう。
Sub TestFunc3_2()
Dim sName As String
sName = ActiveSheet.Name
Worksheets("Sheet2").Activate
Worksheets("Sheet2").Range("A2:A3").Select
'シート選択後、何らかの処理を行う
'アクティブなシートを元に戻す
Worksheets(sName).Activate
End Sub
予防策
ケース1の予防策
For文等の繰り返し処理を行うときに変数の初期値として0を代入してしまい、本エラーが発生することが多いです。For文等を使用するときは注意しましょう。
ケース2の予防策
For文等の繰り返し処理を行うときに変数に0を入れてしまうことが多いです。For文を使用するときは注意しましょう。
ケース3の予防策
可能であれば、Selectを使用せずに直接セル(範囲)を指定した処理を行うことを考慮しましょう(Range("A1").Selectでなく、Range("A1").Copyとする等)。