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

いつもお世話になっております。
下記のコードでおしえてくれませんでしょうか

条件にあったシートに同じ作業をしたいのですが、
うまくいきません。

Dim ws As Worksheet
Dim i As Long, Sw()
i = 0
For Each ws In Worksheets
If ws.Name = "作業中" Or ws.Name = "Sheet7" Then
ReDim Preserve Sw(i)
Sw(i) = ws.Name
i = i + 1
End If

Worksheets(Sw).Tab.ColorIndex = 3  'ここでエラーになります。

Next

質問者からの補足コメント

  • はいそのとおりです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/03/10 19:04

A 回答 (4件)

こんばんは、


めぐみん_様が回答されている通り、一括でシートタグの色変更は出来ません。
エラーメッセージの ”このプロパティ・・メソッドはサポートしていません” が回答のすべてのようです。

参考程度として

試しに
自動記録マクロで記録すると
Sheets(Array("作業中", "Sheet7")).Select
Sheets("作業中").Activate
With ActiveWorkbook.Sheets("作業中").Tab
.Color = 255
.TintAndShade = 0
End With
With ActiveWorkbook.Sheets("Sheet7").Tab
.Color = 255
.TintAndShade = 0
End With

複数シートを選択しているにもかかわらず、個々のシートに対しシート名を明示的に指定して実行しています。
また、エラーにならない Sheets(Array("作業中", "Sheet7")).Selectを
Sheets(Array("作業中", "Sheet7")).Tab.ColorIndex = 3のようにすると
同様のエラーが返ってきます。
オブジェクトに対しては、基本的に明示的にするみたいなのかもしれません。

代替え案もすでにありますが、Nextの外で処理をするなら、他の処理と合わせて、、ご存知(定番)の、For Each ~ や 
For i = 0 To UBound(Sw)
Worksheets(Sw(i))・・・
みたいになるのでは、と思います。
    • good
    • 1
この回答へのお礼

いつもお世話になっております。
ご参考になりました。
ありがとうございました。

お礼日時:2021/03/10 19:03

No.1です。



WorkSheetsを分割し1個ずつ処理する方法は確かご存じであるとの前提で、今回は配列に入れて一括で出来るかどうかのご質問とお見受けしましたが違いましたでしょうか?
この回答への補足あり
    • good
    • 0

以下のようにされてはいかがでしょうか。


Dim ws As Worksheet
Dim i As Long, Sw()
i = 0
For Each ws In Worksheets
If ws.Name = "作業中" Or ws.Name = "Sheet7" Then
ReDim Preserve Sw(i)
Sw(i) = ws.Name
i = i + 1
ws.Tab.ColorIndex = 3 'ここに挿入
End If
Next
    • good
    • 0
この回答へのお礼

上手くいきました。
ありがとうございました。
一度ws.Tab.ColorIndex = 3
これに近いのやったんですけど
場所が違っていたのかも

お礼日時:2021/03/10 19:02

仮に手動で複数選択したシートであっても処理自体は分割し1つずつやると思いますよ。


そこまでMicrosoftも力を入れてはいないでしょうし。(憶測です)
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2021/03/10 19:02

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