プロが教えるわが家の防犯対策術!

下記のようなコードを書きたいのですが「オブジェクトが必要です」というエラーが
出力されてしまいできないようです。何か代替案はありますでしょうか。

---
dim ws as worksheet
with thisworkbook
for each ws in array(.worksheets(1),.worksheets(2),.worksheets(3))
with ws
'ここに処理を書く
end with
next ws
end with
---

ちなみにこのbookにある全てワークシートで処理を回したいわけではなく
特定のシートのみで処理をしたいです。

エクセル2003です。
よろしくお願いします。

A 回答 (4件)

ArrayはVariant型であり、オブジェクトでは無いとされるからではないでしょうか。


素直に配列としてアクセスするか、

Sub test()
Dim ws As Worksheet
Dim buf As Variant
Dim i As Long

With ThisWorkbook
buf = Array(.Worksheets(1), .Worksheets(2), .Worksheets(3))
For i = LBound(buf) To UBound(buf)
With buf(i)
Debug.Print .Name
End With
Next i
End With
End Sub

どうしてもEachが使いたければ、Collectionに収納すれば良いかも。
下記shはObject型でなければダメかと思いましたが、Worksheet型でも大丈夫でした。インテリセンスが効くメリットはありそうですね。
Sub test2()
Dim wsCollection As Collection
Dim sh As Worksheet

Set wsCollection = New Collection
With ThisWorkbook
wsCollection.Add .Worksheets(1)
wsCollection.Add .Worksheets(2)
wsCollection.Add .Worksheets(3)
End With
For Each sh In wsCollection
Debug.Print sh.Name
Next sh
End Sub
    • good
    • 0
この回答へのお礼

前者はNo.4と大体同じですね。今回はこの方法でやることにしました。
後者はAddが1つずつしかできないのがデメリットですね。
ありがとうございました。

お礼日時:2012/07/29 19:14

#2です。


追加ですが、下記はエラーにならず動作します。あまり使いたく無いですが...
Sub test()
Dim ws As Variant '<- ここをVariant型で宣言
With ThisWorkbook
For Each ws In Array(.Worksheets(1), .Worksheets(2), .Worksheets(3))
With ws
Debug.Print ws.Name
End With
Next ws
End With
End Sub
    • good
    • 0
この回答へのお礼

なるほど。Variant型でいけるのですね。
ありがとうございました。

お礼日時:2012/07/29 19:01

sheetsでもworksheetsでもどちらで書いてもいいですが、


名前で指定すると、シートの順番も変えて処理できます。
For Each ws In .Sheets(Array(.Sheets(1).Name, .Sheets(4).Name, Sheets(2).Name))
    • good
    • 0
この回答へのお礼

質問の意図が伝わらなかったみたいです。
ありがとうございました。

お礼日時:2012/07/29 19:00

> 「オブジェクトが必要です」というエラーが


どの行で出ます?

withを書いたのだから、項目の前に.(ドット)が必要なのでは?
    • good
    • 0
この回答へのお礼

ドットはあると思います。
回答ありがとうございました。

お礼日時:2012/07/29 19:00

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

このQ&Aを見た人はこんなQ&Aも見ています