顺序不重要的VBA循环

问题描述 投票:0回答:1

我想在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个变量,这将使代码无法使用。

有什么技巧可以优化这个循环吗?

谢谢你。

excel vba excel-vba loops do-while
1个回答
2
投票

根据你的评论,你不想要一个给定组合的permutations。 让我们假设我们正在混合涂料。 我们有五种不同的颜色。

  1. 白色
  2. 黑色
  3. 蓝色
  4. 绿化

我们要混合三个罐子的所有可能的组合,但一旦我们混合了

白、蓝、绿

我们不需要任何这些。

白,绿,蓝,绿,白,蓝,绿,蓝,白,蓝,绿,白,蓝,白,绿,白,蓝,白,绿。

因为它们的结果都是一样的浅茶色。

首先我们以这种交错的方式运行循环。

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

这样我们就得到了

enter image description here

这样就可以删除那些被篡改的重复数据,同时也可以删除一些组合,比如:

蓝色,蓝色,白色

为了把这些东西找回来,我们稍微调整一下环路。

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

现在我们有了

enter image description here

这可能是你想要的


0
投票

如果你需要在一个表格中循环,我将循环抛出表格的行和列,用双倍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循环可以是独立的,所以不需要嵌套。

所以我不知道是我回答了你的问题还是我遗漏了什么。

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.