【发布时间】:2016-12-12 04:22:52
【问题描述】:
我正在编写一个 VBA 代码,它通过定义的矩阵大小并在其限制内随机填充单元格。
我从 stackoverflow 上的用户那里得到了代码,但在测试后我意识到它不适合避免重复填充,例如在填充 5 个单元格时,我只能看到 4 个单元格被填充,这意味着随机填充作用于先前填充的单元格。
这是我正在使用的代码:
Dim lRandom As Long
Dim sCells As String
Dim sRandom As String
Dim rMolecules As Range
Dim i As Integer, j As Integer
Dim lArea As Long
lArea = 400 '20x20
'Populate string of cells that make up the container so they can be chosen at random
For i = 1 To 20
For j = 1 To 20
sCells = sCells & "|" & Cells(i, j).Address
Next j
Next i
sCells = sCells & "|"
'Color the molecules at random
For i = 1 To WorksheetFunction.Min(5, lArea)
Randomize
lRandom = Int(Rnd() * 400) + 1
sRandom = Split(sCells, "|")(lRandom)
Select Case (i = 1)
Case True: Set rMolecules = Range(sRandom)
Case Else: Set rMolecules = Union(rMolecules, Range(Split(sCells, "|")(lRandom)))
End Select
sCells = Replace(sCells, "|" & sRandom & "|", "|")
lArea = lArea - 1
Next i
rMolecules.Interior.ColorIndex = 5
使用同样完美的代码,我可以插入什么以及在哪里执行此操作,以便代码检查单元格之前是否已经填充了字符串或颜色?
我觉得我正在寻找的这段代码应该就在之前
rMolecules.Interior.ColorIndex = 5
但我不知道该输入什么。
编辑 从 cmets 我意识到我应该更具体。 我正在尝试用蓝色(.ColorIndex = 5)随机填充单元格,但我首先需要检查的是随机化是否没有标记单元格两次,例如在这种情况下,如果我想标记5 个不同的单元格,由于重复,它仅标记其中 4 个,因此仅用蓝色填充 4 个单元格。我需要避免这种情况,让它选择另一个单元格来标记/填充。
感谢您的帮助。
【问题讨论】:
-
除了你的主要问题,你应该从循环中删除
Randomize,甚至从整个函数中删除。它只需要使用一次——最好是在打开工作簿时使用。如果您在循环中使用Randomize- 您将从一组 256 个值中获取随机值 - 这是一个奇怪的错误,自 VBA 开始以来就一直存在。 -
我必须说我不完全理解你想要做什么。您正在寻找一种用随机颜色填充单元格但又不想重复颜色的方法?
-
@Spurious:我正在寻找一种用某种颜色(在本例中为蓝色)随机填充单元格的方法,但在填充单元格之前,它应该检查随机化是否未标记一个单元格两次 - 这意味着当我用 .ColorIndex = 5 填充它时,它不会再次填充同一个单元格
-
如果
.ColorIndex = 5之前没有填写,它会是真的吗? IE。在此之前,您的工作表是否有不同的内部颜色,或者这仅用于将单元格标记为随机? -
如果颜色已经是蓝色应该怎么办?
标签: vba excel loops duplicates