【问题标题】:Exiting Nested For loop VBA and re-looping退出嵌套 For 循环 VBA 并重新循环
【发布时间】:2016-04-17 18:58:03
【问题描述】:

我正在尝试使用嵌套的 For 循环。我基本上有2个数组,我想使用array1中的第一个变量和array2中的第一个变量来做一些操作,依此类推,直到数组用完。不幸的是,Exit For 不会退出 For 级别。因此,我尝试使用 goTo 命令,但是由于我正在尝试重新访问该数组,因此我清楚地收到“此数组已修复或暂时锁定”的错误。我被困在如何在 VBA 中解决这个问题。下面是我的代码,在 MsgBox 中将进行一些操作(需要对 (dAFL,AFL),(dSF,SF) 等):

For Each vN In Array(dAFLcell, dSFcell, dSOcell, dFIGcell, dIBAcell, dIBXcell)
a = 0
For Each vN2 In Array(AFLcell, SFcell, SOcell, FIGcell, IBAcell, IBXcell)


If i = a Then
    MsgBox a
    GoTo end_of_for
End If
a = a + 1
Next vN2
end_of_for:
i = i + 1
Next vN

【问题讨论】:

    标签: arrays vba excel for-loop nested


    【解决方案1】:

    这是另一种可能的方法:

      Dim vn, Vn2 As Variant
      Dim i, min As Integer
    
      vn = Array(dAFLcell, dSFcell, dSOcell, dFIGcell, dIBAcell, dIBXcell)
      Vn2 = Array(AFLcell, SFcell, SOcell, FIGcell, IBAcell, IBXcell)
    
      If UBound(vn) <= UBound(Vn2) Then
        min = UBound(vn)
      Else
        min = UBound(Vn2)
      End If
    
      For i = LBound(vn) To min
        If vn(i) = Vn2(i) Then
          MsgBox vn(i)
          Exit For
        End If
      Next i
    

    【讨论】:

    • 如果使用 3 个 for 循环,这个解决方案会更健壮吗?
    • 循环内的循环意味着 x * y 次迭代......更少应该更有效;不一定更健壮,这取决于你想要什么。我阅读您的问题的方式是,您想将arrayA(1)与arrayB(1)进行比较,将arrayA(2)与arrayB(2)进行比较。如果是这样,单个循环应该就可以解决问题。诚然,我们说的是几张唱片,而不是几百万张,所以“高效”并不是那么重要。
    • 我应该提一下,我可能误读了您的要求!
    • 是的,就我的直接问题而言,它只有 2 个数组。但是我有一个想法,我可能需要一个第三个数组来比较 arrayA(1) 到 arrayB(1) 到 arrayC(1),并想知道这是否是一个更好的方法。
    • 我明白了——在那种情况下,我认为如果你可以摆脱做一个循环,我仍然认为这可能是最有效的。例如,如果每个数组中有 100 个元素,则单个循环迭代 100 次,而如果有 3 个循环,则可能有 100 x 100 x 100 次迭代。当然,短路最终会小于那个值,但你明白了。我确实喜欢@charliefox2 解决方案并对其进行了 +1 操作。这是对您的问题/代码的最直接答案。
    【解决方案2】:

    您可以使用布尔标志 - 我不知道这是公认的方法,但我不时使用它。

    Dim skipBool as Boolean = False    
    
    For Each vN In Array(dAFLcell, dSFcell, dSOcell, dFIGcell, dIBAcell, dIBXcell)
        a = 0 'I think you want this out here, otherwise a will always equal 0
        For Each vN2 In Array(AFLcell, SFcell, SOcell, FIGcell, IBAcell, IBXcell)    
            If Not skipBool Then 'run this stuff only if we don't want to skip it (duh!)       
    
                If i = a Then
                    MsgBox a
                    skipBool = True 'set skipBool to be True (we want to skip it!)
                End If
                a = a + 1
            End If
        Next vN2
        i = i + 1
        skipBool = False 'reset skipBool for the next go around
    Next vN
    

    我确信这段代码可以进一步优化(老实说,我还没有测试过),但看起来这就是你想要的。

    老实说,唯一的问题可能是 a = 0 在第二个 for 循环中,这就是为什么您没有得到预期结果的原因。我使用 VBA 已经有一段时间了(我只使用过 VB.NET),所以我不记得那里的确切语法。我会尝试解决这个问题,然后返回方法的出口。如果它仍然不起作用,我的代码应该。

    【讨论】:

    • 是的,这正是我想要的。我应该在发布之前尝试布尔值。谢谢你的时间。但是,即使在 for 循环之外使用 a=0,我的方式的问题也是数组被 goto 锁定的错误。我不太明白这个错误,但很高兴有另一种方法来做到这一点。谢谢。
    • 没问题。您是否使用Exit For 得到“数组已修复”错误?您不应该 - 然后,在第一个 For Each 之外使用 a = 0,它应该与我的答案完全相同。
    • 在您的解决方案中使用 Exit For 会导致编译错误。我不太确定你在问什么:)
    • 有机会会更新。也就是说,如果它没有坏,就不要修理它;)
    • 是的,我不会担心哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2012-10-10
    • 2021-06-01
    • 1970-01-01
    相关资源
    最近更新 更多