アプリケーション定義またはオブジェクト定義のエラーです。

エラー表示

このエラーが発生すると、マクロ起動時(コンパイル時)に次のエラーが表示されます。
実行時エラー '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とする等)。

関連リンク

ページの先頭へ