• 締切済み

VBAで指定の色のセルをランダムで選択するには

VBAでA6が赤色なら赤色じゃなくなるまでB6からAF6の範囲の黄色い枠をランダムで優先的に選択して、黄色い枠がなくなった時はB6からAF6までランダムに選択して○を入れるにはどうすればいいですか? シフトの自動生成ツールをつくってるのですが、月間休日数が9日未満だとA6が赤く光ります。B6からAF6の中で7日連続で休みがない場合は黄色に光ります。 自動生成後に今までは手動で直していたのですが、時間がかかるため自動化したいです。

みんなの回答

  • SI299792
  • ベストアンサー率47% (774/1619)
回答No.1

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

関連するQ&A