首页 > 解决方案 > 如何告诉计算机“循环”属于VBA中的“直到”?

问题描述

我对 do until 循环有疑问。下面的第一个测试代码(code1)运行良好。但是,如果我将“Then”之后的部分放在新行中,如第二个代码所示(因为我计划稍后在“Then”之后添加更多命令),它会返回错误消息“Loop without do”。工作代码(code1)是:

Sub CopyValues()

Dim s As Integer
Dim r As Integer

Cells(2, 4).Value = "Before"
Cells(2, 5).Value = "After"

For r = 1 To 3
    s = 0

    Do
        s = s + 1
        If InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0 Then Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = Cells(s, 2).Value
    Loop Until InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0

Next r
End Sub

不工作的代码(code2)是这样的:

Sub CopyValues()

Dim s As Integer
Dim r As Integer

Cells(2, 4).Value = "Before"
Cells(2, 5).Value = "After"

For r = 1 To 3
    s = 0

    Do
        s = s + 1
        If InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0 Then
            Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = Cells(s, 2).Value
    Loop Until InStr(Cells(s, 2).Value, "ROI_" & r & "A") > 0

Next r
End Sub

亲切的问候费伦茨

标签: exceldo-loopsvba

解决方案


即使您收到的错误消息是“没有执行的循环”,该错误实际上与您的 If 语句有关,它需要End If在您希望在您的 If 语句中执行的命令之后加上单独的行。

当这样的标记丢失时,您通常会收到一条不代表实际错误的错误消息,因此在调试时请留意那些丢失的结尾元素(End IfNextLoop等)!

作为补充,这里讨论了 If 语句的单行版本与多行版本:

1)当条件为真时只有一条语句要执行时:

  • 您可以使用最后需要的多行版本End If
    如果条件那么
        做一点事
    万一
  • 您可以使用最后不需要的If 语句的单行版本End If
    If Condition Then Do_Something

选择哪一个是个人喜好问题。在只有一条语句要执行的情况下,使用单行版本似乎很合适,因为它更整洁

但是,多行版本仍然更加灵活。例如,想象一下,在路上,您意识到您需要您的 If 语句来执行更多的语句,您将不得不切换回多行版本*。此外,要在条件返回 false 时合并ElseElseIf在代码中执行某些操作,您还需要多行版本**(此处有更多详细信息)。

2) 当条件为真时有多个语句要执行时:

  • 应该像这样使用多行版本:
    如果条件那么
        做一点事
        Do_Another_Thing
    万一
  • 可以,但应该避免使用单行版本。但是,如果您真的想这样做,则必须将它与冒号 (:) 结合使用来分隔您的语句,如下所示:
    If Condition Then Do_Something: Do_Another_Thing

在这种情况下,我说你应该避免使用单行版本的原因是因为它变得非常难以阅读,而且并不是每个人都熟悉使用冒号(:) 来放置多个语句同一行(此处有更多详细信息

脚注:
*:如第 2 部分所述,您不必绝对切换,但强烈建议这样做。
**:您实际上可以Else使用 将 写在同一行
If Condition Then Do_Something Else Do_Something_Else,但出于可读性原因,我不鼓励这样做。


推荐阅读