我正在尝试对 3 个变量运行一个循环,其中的顺序无关紧要。
我首先尝试的代码如下,其中 nx 遍历行,limit 是我数据库的最后一行:
Do While n3 <= limit
Do While n2 <= limit
Do While n1 <= limit
Call Output
n1 = n1 + 1
Loop
Call Output
n2 = n2 + 1
n1 = n0
Loop
Call Output
n3 = n3 + 1
n2 = n0
n1 = n0
Loop
这让我可以测试每一种可能性,但它也会多次重复相同的组合,从而增加了运行时间。如果我计划测试,比方说,20 个变量,这将使代码无法使用。
关于如何优化这个循环有什么建议吗?
谢谢。
最佳答案
根据您的评论,您不想要给定组合的排列。假设我们正在混合油漆。我们有五种不同的颜色:
- 白色
- 黑色
- 黄色
- 蓝色
- 绿色
我们想混合三个 jar 头的所有可能组合,但是一旦我们混合完毕
白色、蓝色、绿色
我们不需要这些:
白,绿,蓝
绿,白,蓝
绿,蓝,白
蓝,绿,白
蓝,白,绿
因为它们都产生相同的浅蓝绿色。
首先我们以这种交错的方式运行循环:
Sub MixPaint()
Dim arr(1 To 5) As String
Dim i As Long, j As Long, k As Long, LL As Long
arr(1) = "white"
arr(2) = "black"
arr(3) = "blue"
arr(4) = "green"
arr(5) = "yellow"
LL = 1
For i = 1 To 3
For j = i + 1 To 4
For k = j + 1 To 5
Cells(LL, 1) = arr(i) & ":" & arr(j) & ":" & arr(k)
LL = LL + 1
Next k
Next j
Next i
End Sub
这让我们:
这会删除排列的重复项,但也会删除组合,例如:
蓝色,蓝色,白色
为了恢复这些,我们稍微调整了循环:
Sub MixPaint2()
Dim arr(1 To 5) As String
Dim i As Long, j As Long, k As Long, LL As Long
arr(1) = "white"
arr(2) = "black"
arr(3) = "blue"
arr(4) = "green"
arr(5) = "yellow"
LL = 1
For i = 1 To 5
For j = i To 5
For k = j To 5
Cells(LL, 5) = arr(i) & ":" & arr(j) & ":" & arr(k)
LL = LL + 1
Next k
Next j
Next i
End Sub
现在我们有:
这可能就是您所追求的。
关于excel - 顺序无关紧要的VBA循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61974473/