如何告诉计算机"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 If
、Next
, Loop
, 等等)调试时!
作为补充,这里讨论了 If 语句的单行版本与多行版本:
1)当条件为真时只有一条语句要执行:
- 你可以使用多行版本,最后需要
End If
:
If Condition Then
Do_Something
End If
- 您可以使用 If 语句的单行版本,不需要 末尾的
End If
:
If Condition Then Do_Something
选择哪一个是个人喜好问题。在只有一个语句要执行的情况下,使用 one-line 版本似乎是合适的,因为它使它 neater.
但是,多行 版本仍然更加灵活。例如,想象一下,在路上,您意识到您需要 If 语句来执行更多语句,您将不得不切换回多行版本*。此外,要在代码中加入 Else
或 ElseIf
以在条件 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
,但出于可读性原因,我不鼓励这样做。
我对 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 If
、Next
, Loop
, 等等)调试时!
作为补充,这里讨论了 If 语句的单行版本与多行版本:
1)当条件为真时只有一条语句要执行:
- 你可以使用多行版本,最后需要
End If
:
If Condition Then Do_Something End If
- 您可以使用 If 语句的单行版本,不需要 末尾的
End If
:
If Condition Then Do_Something
选择哪一个是个人喜好问题。在只有一个语句要执行的情况下,使用 one-line 版本似乎是合适的,因为它使它 neater.
但是,多行 版本仍然更加灵活。例如,想象一下,在路上,您意识到您需要 If 语句来执行更多语句,您将不得不切换回多行版本*。此外,要在代码中加入 Else
或 ElseIf
以在条件 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
,但出于可读性原因,我不鼓励这样做。