【问题标题】:VBA Nested Do While Loops are operating in seriesVBA 嵌套 Do While 循环串联运行
【发布时间】:2021-02-15 11:36:29
【问题描述】:

我有一个非常简单的问题。 我试图在 Excel VBA 中嵌套两个“Do While”循环。 下面的测试代码重现了我遇到的问题。

下面的代码应该产生 12 个消息框。 9 用于嵌套循环,因为它被触发了 3 次,主循环也被触发了 3 次,另外 3 个消息框用于主循环。

我发现两个循环串联运行,就好像它们没有嵌套一样,所以我总共得到 6 个消息框。

我确信我过去在 VBA 中使用过嵌套循环没有问题(尽管现在我可能需要回去检查一下)。

为什么嵌套循环是一系列行为?它在您的计算机上表现如何?我错过了一个简单的语法错误吗?

Sub test()
    i = 0
    m = 0
    Do While i < 3
        Do While m < 3
            MsgBox ("Nested Loop " & m)
            m = m + 1
        Loop
        MsgBox ("Master Loop " & i)
        i = i + 1
    Loop
End Sub

【问题讨论】:

    标签: excel vba loops nested


    【解决方案1】:

    您需要在i 循环内重置m 变量,否则它只会在第一次运行m 循环,因为在您的代码中,一旦m 达到3,它将始终是3

    Sub test()
        i = 0
        Do While i < 3
            m = 0
            Do While m < 3
                MsgBox "Nested Loop " & m
                m = m + 1
            Loop
            MsgBox "Master Loop " & i
            i = i + 1
        Loop
    End Sub
    

    另外,除非您希望它返回一个值,否则不要在 MsgBox 中使用括号。

    【讨论】:

    • 天哪,我真傻。甚至有点尴尬。谢谢你的帮助。 5分钟后我会接受答案。
    【解决方案2】:

    在进入循环块之前,两个循环的上下界都是已知的。

    在这种情况下使用的正确循环结构是For...Next:

    Sub test()
        Dim i As Long
        Dim m As Long
        For i = 0 To 2
            For m = 0 To 2
                Debug.Print "Inner Loop " & m
            Next
            Debug.Print "Outer Loop " & i
        Next
    End Sub
    

    如果在循环开始时迭代次数未知,或者取决于执行过程中满足的条件,请使用 Do...Loop 块(Do...WhileDo While...LoopDo...Until 等)循环体。

    这样您就不需要操作/增加/重置任何循环计数器变量。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      相关资源
      最近更新 更多