- 締切済み
VBAで指定の色のセルをランダムで選択するには
VBAでA6が赤色なら赤色じゃなくなるまでB6からAF6の範囲の黄色い枠をランダムで優先的に選択して、黄色い枠がなくなった時はB6からAF6までランダムに選択して○を入れるにはどうすればいいですか? シフトの自動生成ツールをつくってるのですが、月間休日数が9日未満だとA6が赤く光ります。B6からAF6の中で7日連続で休みがない場合は黄色に光ります。 自動生成後に今までは手動で直していたのですが、時間がかかるため自動化したいです。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- SI299792
- ベストアンサー率47% (774/1619)
Macro1:これは、まず全て黄色に○を入れて、それからランダムに入れた方が効率的ではないでしょうか。 Macro2:黄色が埋まる前に赤になる可能性を考慮し、黄色優先でランダムに入れるプログラムです。 A6が赤になるのを信じて作りました。赤にならなければ無権ループになります。 最初ににB6~AF6 をクリアします。 黄色は、条件付き書式でなく、直接入れているものとします。 Option Explicit ' Sub Macro1() Dim Area As Range Dim Cell As Range Dim Rand As Integer ' Set Area = [B6:AF6] Area.ClearContents ' For Each Cell In Area ' If Cell.Interior.Color = vbYellow Then Cell = "○" End If Next Cell ' Do Until [A6].DisplayFormat.Interior.Color = vbRed Rand = Rnd * Area.Count + 0.5 Area(Rand) = "○" Loop End Sub ' Sub Macro2() Dim Area As Range Dim Cell As Range Dim Count As Integer Dim Rand As Integer ' Set Area = [B6:AF6] Area.ClearContents ' For Each Cell In Area Count = Count - (Cell.Interior.Color = vbYellow) Next Cell ' Do Until [A6].DisplayFormat.Interior.Color = vbRed Rand = Rnd * Area.Count + 0.5 ' If Area(Rand).Interior.Color = vbYellow Or _ WorksheetFunction.CountA(Area) >= Count Then Area(Rand) = "○" End If Loop End Sub