システムメンテナンスのお知らせ

VBA初心者です。
下のプログラムの★部分で
「実行時エラー'1004'
アプリケーション定義またはオブジェクト定義のエラーです。」
というエラーが発生します。
どなたか原因を教えていただけないでしょうか??

Dim aRange As Range
Dim bRange As Range

Set aRange = Range(Sheets("シートA").Range("A3"), Sheets("シートB").Range("A3").End(xlDown)) ★

Set bRange = Range(Sheets("シートB").Range("A3"), Sheets("シートB").Range("A3").End(xlDown))

下のシートBの範囲取得と同じことをしているつもりなのですが、うまくいきません。
どうぞよろしくお願い致します。

gooドクター

A 回答 (3件)

>Set aRange = Range(Sheets("シートA").Range("A3"), Sheets("シートB").Range("A3").End(xlDown


範囲を定義しているのはわかりますが、Rangeのカッコ内の
Sheets("シートA").Range("A3")
Sheets("シートB").Range("A3").End(xlDown))
は、指定セルに、どんな内容が入っていますか。
ーー
私が試してみると、B1にA1、B2にA3が入っているとき
Sub test01()
' Range("A1:A3").Select
Range(Range(Range("B1")), Range(Range("B2"))).Select
End Sub
の上と下が同じになりますが、下の型とも違う。
Range(A1, A3).Selectはエラーになります(1004エラー)
Range(Range("A1"), Range("A5")).SelectはOK。
ーー
RangeはRange("A1")とか
Range(Cells(i,j),Cells(K,l))
とかの型で使いますが、質問のコードは、どちらの型にも当てはまらないようなのだが。
それと
Sheets("シートA")やSheets("シートB")のように複数シートの参照が出てきたとき、
Set aRange = Range()のRangeの前にも、明示的にシート名を入れるべき経験をしたように思います。
しかしsh2.Range(sh1.Cells(1, 2) & ":" & sh1.Cells(2, 2)).Select
はダメでした。
それで
Sub test01()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
sh2.Activate
Range(sh1.Cells(1, 2) & ":" & sh1.Cells(2, 2)).Select
End Sub
でSheet1のB1にA1、B2にA5の場合Sheet2のA1:A5を範囲選択に成功しました。
SelectはActiveなシートの範囲を指定しないとだめだたように思います。
以上参考になれば。
    • good
    • 0

こんばんは。



「実行時エラー'1004'アプリケーション定義またはオブジェクト定義のエラーです。」

そのエラーは、オブジェクト・エラーのようですね。

一度、F2 を押して、オブジェクトブラウザを見ていただけるとよいのですが、Range オブジェクトの親オブジェクトにあたるものは、一般では、Worksheet とApplication オブジェクトです。

今、そのコードが置かれている場所は、[シートモジュール]だと思います。

そうすると、親オブジェクトは、そのままの状態では、その書かれたモジュールのワークシート・オブジェクトだと、VBAでは理解してしまいます。そうすると、Range の親オブジェクトと中で指し示すシート・オブジェクトが違ってしまい、オブジェクト・エラーが出てしまいます。

まず、Excel VBAでは、特別なことがない限りは、「標準モジュール」を使ってください。
記録マクロで、書き込まれる場所です。

With Worksheets("シートA")
 Set aRange = .Range(.Range("A3"), .Range("A3").End(xlDown))
End With

With Worksheets("シートB")
 Set bRange = .Range(.Range("A3"), .Range("A3").End(xlDown))
End With

このようにして、囲みます。Rangeの手前に、点(.)がつけてあります。そうすると、入力の手間が減り、ミスも少なくなります。
= の後の Range にも、シートオブジェクトの下に入り、整合性が取れるようになります。
    • good
    • 0

>Sheets("シートA").Range("A3"), Sheets("シートB").Range("A3")



二つのシートを跨いで範囲設定しているせいでは?

Sheets("シートA").Range("A3"), Sheets("シートA").Range("A3")
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング