我想在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个变量,这将使代码无法使用。
有什么技巧可以优化这个循环吗?
谢谢你。
根据你的评论,你不想要一个给定组合的permutations。 让我们假设我们正在混合涂料。 我们有五种不同的颜色。
我们要混合三个罐子的所有可能的组合,但一旦我们混合了
白、蓝、绿
我们不需要任何这些。
白,绿,蓝,绿,白,蓝,绿,蓝,白,蓝,绿,白,蓝,白,绿,白,蓝,白,绿。
因为它们的结果都是一样的浅茶色。
首先我们以这种交错的方式运行循环。
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
现在我们有了
这可能是你想要的
如果你需要在一个表格中循环,我将循环抛出表格的行和列,用双倍foro双倍while,通过所有的单元格,以避免重复的组合。根据你的while方法,这将是。
Do While row <= rowLimit
Do While col <= colLimit
'with if conditions you can make your operations
col = col +1
Loop
row = row + 1
Loop
如果你需要独立地循环通过行, 你不需要whiles是嵌套的, 每个while可以独立地循环其行。如果n1、n2和n3相互之间有依赖关系,你需要解释这些,这样就可以考虑它们的关系,将确定的组合从嵌套循环中排除。这是你的循环日志,例如n1=n2=n3,极限=2。
1 0 0
0 1 0
0 0 0
1 0 0
2 0 0
3 0 0
0 1 0
1 1 0
2 1 0
3 1 0
0 2 0
1 2 0
2 2 0
3 2 0
0 3 0
0 0 1
1 0 1
2 0 1
3 0 1
0 1 1
1 1 1
2 1 1
3 1 1
0 2 1
1 2 1
2 2 1
3 2 1
0 3 1
0 0 2
1 0 2
2 0 2
3 0 2
0 1 2
1 1 2
2 1 2
3 1 2
0 2 2
1 2 2
2 2 2
3 2 2
0 3 2
但是如果顺序不重要,你需要循环每一个n,直到行的限制,没有n值重述,那么while循环可以是独立的,所以不需要嵌套。
所以我不知道是我回答了你的问题还是我遗漏了什么。
希望能帮到你