如何告诉计算机"loop"属于VBA中的"do until"?

How to tell the computer that "loop" belongs to "do until" in VBA?

我对 do until 循环有疑问。下面的第一个测试代码 (code1) 运行良好。但是,如果我将 "Then" 之后的部分放在新行中,如第二个代码所示(因为我打算稍后在 "Then" 之后添加更多命令),它 returns错误消息 "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

亲切的问候 费伦茨

即使您收到的错误消息是 "loop without do",该错误实际上与您的 If 语句有关,该语句需要在您要执行的命令之后单独添加一行 End If在你的 If 语句中。

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

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

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

  • 你可以使用多行版本,最后需要End If
    If Condition Then
        Do_Something
    End If
  • 您可以使用 If 语句的单行版本,不需要 末尾的 End If
    If Condition Then Do_Something

选择哪一个是个人喜好问题。在只有一个语句要执行的情况下,使用 one-line 版本似乎是合适的,因为它使它 neater.

但是,多行 版本仍然更加灵活。例如,想象一下,在路上,您意识到您需要 If 语句来执行更多语句,您将不得不切换回多行版本*。此外,要在代码中加入 ElseElseIf 以在条件 returns 为假时执行某些操作,您还需要多行版本** (More details here)。

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

  • 应该像这样使用多行版本:
    If Condition Then
        Do_Something
        Do_Another_Thing
    End If
  • 可以,但应该避免使用单行版本。但是如果你真的想要,你必须将它与冒号 (:) 结合使用来分隔你的语句,如下所示:
    If Condition Then Do_Something: Do_Another_Thing

在这种情况下,我之所以说您应该避免使用单行版本,是因为它难以阅读而且并不是每个人都熟悉使用冒号 (:) 将多个语句放在同一行 (More details here)

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