- ベストアンサー
VBAで表の塗りつぶしを制御する方法
- VBAを使用して、表の特定のセルに数値を入力すると、その横のセルの背景を塗りつぶすことができます。例えば、I9セルに数値を入力すると、J9セルからY9セルまで(4日間)を塗りつぶすことができます。
- しかし、休日のセルを飛ばして残りの日にちを指定したい場合は、V9から始めることができます。具体的には、I9セルに数値を入力した場合、U9セルまでは通常の塗りつぶしを行い、V9からY9セルまでの休日を飛ばして、AD9セルから始めることができます。
- 日付と曜日を塗りつぶしている色はColorIndex = 38です。また、祝日の場合でも同じColorIndex = 38で塗りつぶします。したがって、月火を塗りつぶし、水曜日は空けて木金を塗りつぶす場合なども対応可能です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 関係あるかわかりませんが、2行目の日付が入っているセルはF列からI列まで、J列からM列まで・・・、といった感じで4列ずつで結合されています。 > これが原因なのでしょうか? これです……。 結合セルは右上のセルだけが塗りつぶされている扱いになります。 必ず4列づつ結合されていると言う前提でコードを修正しました。 nCol = Target.Column + 1 nCount = 0 Do While nCount < 16 If Cells(2, nCol).Interior.ColorIndex <> 38 Then If nCount = 0 Then Set MyRange = Range(Cells(Target.Row, nCol), Cells(Target.Row, nCol + 3)) Else Set MyRange = Union(MyRange, Range(Cells(Target.Row, nCol), Cells(Target.Row, nCol + 3))) End If nCount = nCount + 4 End If nCol = nCol + 4 Loop
その他の回答 (2)
- mt2015
- ベストアンサー率49% (258/524)
訂正 誤:結合セルは右上のセルだけが塗りつぶされている扱いになります 正:結合セルは左上のセルだけが塗りつぶされている扱いになります
- mt2015
- ベストアンサー率49% (258/524)
図が細かすぎて良く見えないのですが、2行目がColoeIndex=38なら色を塗らないって事で良いんでしょうか。 こんな感じでどうでしょう。元のコードの一部を以下の様に書き換えてください。 Set MyRange = Range(.Cells(Target.Row, Target.Column + 1), _ .Cells(Target.Row, Target.Column + 16)) ↓ nCol = Target.Column + 1 nCount = 0 '2行目がColorIndex=38では無いセルを16個 MyRangeにセット Do While nCount < 16 If Cells(2, nCol).Interior.ColorIndex <> 38 Then If nCount = 0 Then Set MyRange = Cells(Target.Row, nCol) Else Set MyRange = Union(MyRange, Cells(Target.Row, nCol)) End If nCount = nCount + 1 End If nCol = nCol + 1 Loop
補足
図が見ずらい件、申し訳ございません。 頂いたコードを試してみました。 実行すると土曜のR9セルと日曜のV9セルは塗りつぶされなかったのですが 土曜日のS9からU9と日曜のW9からY9セルが塗りつぶされてしまいました。 関係あるかわかりませんが、2行目の日付が入っているセルはF列からI列まで、J列からM列まで・・・、といった感じで4列ずつで結合されています。 これが原因なのでしょうか?
お礼
ありがとうございます。 頂いたコードで望み通りの操作が行えました。 本当にありがとうございました。