誕生日にもらった意外なもの

エクセルのVBAを使って、同一ブック内の特定の複数のシートに同じ処理を行いたいのです。
私自身にそこまでのスキルが無いのが一番なのですが、ググって使えるのではないかと思われるコードを記述したのですが、最初のアクティブになっているシートしか処理されません。
教えていただけますでしょうか?

Sub 行おきに背景色を変える1()
Dim i As Long, s As Worksheet
Application.ScreenUpdating = False
Sheets(Array("あいう", "かきく", "たちつ", "さしす")).Select
For Each s In ActiveWindow.SelectedSheets
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row Step 2
ActiveSheet.Rows(i).Interior.ColorIndex = 0
Next i
Next s
Application.ScreenUpdating = True
End Sub

「あいう」「かきく」・・・という名のシートを1行おきに背景色を変えたかったのです。
For i からNext i までの記述が1行おきに背景色が変えられるのは確認できています。
※ この部分は同じ処理をする記述ですよね?

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

  • へこむわー

    思っていた通りの処理をしてくれました。
    よく考えてみればおっしゃる通りですね。
    「シートかきく」が選択されている時はアクティブだろうと思ってしまい、何も疑問に思いませんでした(^^;)
    「にわか」が露呈しちゃいましたね。m(__)m

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/04/04 18:16
  • うーん・・・

    アドバイスありがとうございますm(__)m
    はい、年間施行データがあり、1件ずつの担当者(例の「あいう」等)の行ごとに色を付けています。
    そして担当者個々のシートを作り振り分け、見やすいように全行色付なモノを1行おきに変更したかったのです。
    お示しいただいたコードをググりながら(^^;)読み解いて?いるのですが、
    myAryに選択したい候補を記述し、For kで候補を順にとし、Set wSが順番に選択されるシートを宣言。とここまでがシート選択。
    For kからが1行ごとに・・・までは何となく理解できたのですが、「Nothing」が出て来て「Union」が???(^^;)
    「Nothing」が関連付け?等を停止する、「Union」が格納するらしいことはわかったのですが、ここでの結びつき?が???状態なんです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/04/04 18:52
  • うーん・・・

    No.1のtom04さんですよね!?(^^;)
    「ためし」自体は問題なく出来ました。
    そこで、当初の目的の複数のシートを処理するためにNo.1のSet wS = Worksheets(myAry(k))の次の行を差し替えてみました。
    「Cells(i, "A")」は「wS.Cells(i, "A")」に変更しました。
    すると、「”Uinon"メソッドは失敗しました」とエラーが(;´・ω・)
    「For k」がArrayに記述した候補を順番にアクティブにして、「For i」がそのアクティブにされた候補で希望の処理をする、という理解自体が間違っているのでしょうか?

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

A 回答 (4件)

こんにちは!



>ActiveSheet.Rows(i).Interior.ColorIndex = 0
というコトは「塗りつぶしなし」と同じコトなので
あらかじめすべてのSheetのセルが何らかの色で塗りつぶされているというコトでしょうか?

一例です。
1行おきに「薄い黄色」になります。

Sub Sample1()
Dim i As Long, k As Long, myRng As Range
Dim wS As Worksheet, myAry As Variant
myAry = Array("あいう", "かきく", "さしす", "たちつ")
For k = 0 To UBound(myAry)
Set wS = Worksheets(myAry(k))
For i = 1 To wS.Cells(Rows.Count, "A").End(xlUp).Row Step 2
If myRng Is Nothing Then
Set myRng = wS.Cells(i, "A")
Else
Set myRng = Union(myRng, wS.Cells(i, "A"))
End If
Next i
If Not myRng Is Nothing Then '//←念のため//
myRng.EntireRow.Interior.ColorIndex = 36 '//←薄い黄色★//
Set myRng = Nothing
End If
Next k
End Sub

※ お示しのコードのように「塗りつぶしなし」にしたい場合は
「★」の行で調整してください。m(_ _)m
この回答への補足あり
    • good
    • 0
この回答へのお礼

fujillinさんからも「模範解答」とされているこちらをベストアンサーとさせていただきます。
また、複数シートの一括処理を質問していますので、よろしかったら懲りずにお教えいただけたらと思います。(^^;)
ありがとうございました。m(__)m

お礼日時:2017/04/06 19:20

No.1・3です。



>”Uinon"メソッドは失敗しました」とエラーが・・・

おそらく複数シートにまたがって変数「myRng」にセルを格納することはできないはずです。
そのためそのようなメッセージが表示されたのだとおもいます。

必ず1シートずつの操作にする必要がありますので、
次のシートに移る場合「myRng」は「空」にしてやる必要があります。
そのためNo.1のコードでは次のシートに移る前(Next k の前に)
>Set myRng = Nothing
として、「myRng」を「空」にしています。m(_ _)m
    • good
    • 0
この回答へのお礼

「念のため」と有ったので、「記述しなくても動くのか?」と勝手に判断してしまいました(^^;)

お礼日時:2017/04/06 19:22

No.2です。



前回のコードは1行ずつ色付けするのではなく、
Sheet毎にA列の奇数行を選択しておき、その行すべての色に手を付ける方法にしていました。
一つのSheetで↓のコードをためしてみてください。

Sub ためし()
Dim i As Long, myRng As Range
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row Step 2
If myRng Is Nothing Then
Set myRng = Cells(i, "A")
Else
Set myRng = Union(myRng, Cells(i, "A"))
End If
Next i
myRng.EntireRow.Select
End Sub

これで奇数行だけが選択されているはずです。m(_ _)m
この回答への補足あり
    • good
    • 0

こんにちは



すでに模範的な回答が出ていますので、実際の処理はそちらを参照していただくことにして・・・

>最初のアクティブになっているシートしか処理されません。
一番の原因はカラー設定をしている
 ActiveSheet.Rows(i).Interior.ColorIndex = 0
が、アクティブシートに対しての処理になっていることだと思います。
せっかく、
>For Each s In ActiveWindow.SelectedSheets
として順にシートを処理しようとしているのですが、その場合は処理の対象とするシートは「s」でなければうまくいきませんよね。

…ということで、以下の2行でActiveSheetを参照している部分をシートsを参照するように修正すれば、ご提示のコードでもお考えのように動作すると思います。
>For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row Step 2
>ActiveSheet.Rows(i).Interior.ColorIndex = 0
    ↓ ↓ ↓
 For i = 1 To s.Cells(Rows.Count, 1).End(xlUp).Row Step 2
 s.Rows(i).Interior.ColorIndex = 0


VBAでは各シートを順に処理するのが普通の考え方と思いますが、一方で、手動操作では複数のシートを選択しておいてまとめて処理することもできますね。
これをそのままVBA化すると以下のようになりますが、こちらでも同様の処理が可能です。
ただし、複数のシートをまとめて処理しているので、以下では最初のシートでループの範囲を決めてしまっています。
(SelectやActivateの処理が混じるのでお勧めできる記述法ではありませんが、ひとつのご参考までに)

Dim rw As Long

Worksheets(Array("あいう", "かきく", "たちつ", "さしす")).Select
For rw = 1 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row Step 2
 ActiveSheet.Rows(rw).Select
 Selection.Interior.ColorIndex = 0
Next rw
この回答への補足あり
    • good
    • 1
この回答へのお礼

お教えいただいた修正でうまく動作できたのですが、fujillinさんも言われている「模範解答」をベストアンサーとさせていただきました。
ありがとうございましたm(__)m

お礼日時:2017/04/06 19:16

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

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


このQ&Aを見た人がよく見るQ&A