【发布时间】:2016-08-07 23:13:26
【问题描述】:
我有一个在某些边界内填充彩色单元格的工作表,我必须通过NewX 和NewY 参数提供的偏移量随机“移动”填充单元格,选择新单元格,删除填充“旧”单元格并用不同的颜色填充新单元格。
问题在我执行几次运行后开始 - 似乎细胞“消失” - 随着时间的推移,看到的细胞越来越少,我认为这是因为其中一些 重叠 彼此之间,由于我的代码设置为仅查找填充的单元格并移动它们,它们的数量随着时间的推移而减少。
这是我用来移动填充单元格的代码:
Sub Move_Cells()
For k = 1 to 20 'number of runs to perform the determination and movement of cells
For i = 1 To 20 'the number can change due to borders
For j = 1 To 20 'the number can change due to borders
If Cells(i, j).Interior.ColorIndex <> xlNone Then
x = j
Y = i
Randomize
dX = Int((5 - 1 + 1) * Rnd() + 1)
Randomize
dY = Int((5 - 1 + 1) * Rnd() + 1)
NewX = x + dX
NewY = Y + dY
Cells(NewY, NewX).Select
Cells(i, j).Interior.ColorIndex = 0
Selection.Interior.Color = 3
next k
End Sub
我担心的是,您运行 i,j 循环的次数越多,Cells(NewY, NewX).Select 选择重叠的次数越多,从而确定填充的单元格越少。
我正在考虑使用Cells.Address 功能预先确定是否有任何单元格在其(NewY, NewX) 位置重叠并避免它们这样做。
我的另一个想法是以某种方式将包含多个地址的任何单元格从其他单元格的偏移量拆分为其原始编号,但我并不是说Split 功能适合这种情况。有什么办法吗?
感谢您的帮助。
【问题讨论】:
-
您应该只调用
Randomize一次 - 它所做的只是为 RNG 设置初始种子。如果你在快速分离中调用它两次,你可能会得到相同的种子。 -
你说的单元格会重叠是对的。每次您选择一个新单元格时,您可能会选择一个已经着色的单元格,从而有效地“丢失”一个单元格。即使源区域和目标区域没有重叠,仍然有可能为两个源单元格选择相同的目标单元格。为避免这种情况,您需要检查目标单元格,如果已着色,请选择另一个目标单元格(并继续这样做,直到找到未着色的单元格)。
-
注意:如果我正确阅读了您的代码意图,经过 20 次迭代后,您将最终在 A1:T20 中没有彩色单元格,并且在 (U1:Y25, A21: T25) - 这真的是你想要的吗?
-
我在您的代码中没有看到任何包含地址的单元格,您只是在更改单元格的颜色。 `拆分包含多个地址的任何单元格`是什么意思?
-
@YowE3K:该代码中有许多限制,我没有在这里设置,因为它们无关紧要 - 但最重要的是所有单元格都保持在 20x20 限制范围内时间。