Excel 如何告诉计算机;“循环”;属于;直到;在VBA中?

Excel 如何告诉计算机;“循环”;属于;直到;在VBA中?,excel,do-loops,vba,Excel,Do Loops,Vba,我对do-until循环有问题。下面的第一个测试代码(代码1)运行良好。但是,如果我将“Then”后面的部分放在新行中,如第二个代码所示(因为我计划在“Then”后面添加更多命令),它将返回错误消息“Loop without do”。 工作代码(代码1)为: 不工作代码(代码2)如下所示: 问候 ference即使您收到的错误消息是“loop with do”,该错误实际上是关于您的if语句,该语句要求在您希望在if语句中执行的命令之后有一行单独的End if 当这样的标记丢失时,您通常会收到一

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

不工作代码(代码2)如下所示:

问候
ference

即使您收到的错误消息是“loop with do”,该错误实际上是关于您的if语句,该语句要求在您希望在if语句中执行的命令之后有一行单独的
End if

当这样的标记丢失时,您通常会收到一条错误消息,该消息并不表示实际的错误,因此在调试时,请注意那些丢失的结束元素(
End If
Next
Loop
,等等)

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

1) 当条件为true时,只有一条语句要执行时:
  • 您可以使用多行版本,该版本需要
    结尾,如果结尾处有
选择哪一个取决于偏好。在只有一条语句要执行的情况下,使用单行版本似乎是合适的,因为它使更整洁

但是,多行版本仍然保持更灵活。例如,假设在接下来的过程中,您意识到需要If语句来执行更多语句,您必须切换回多行版本*。此外,要在代码中加入
Else
ElseIf
,以便在条件返回false时执行某些操作,还需要多行版本**()

2) 当条件为真时,如果要执行多条语句:
  • 您应该像这样使用多行版本:
如果情况如此 做点什么 再做一件事 如果结束
  • 您可以,但可能应该避免使用单行版本。但若您真的想这样做,那个么您必须将它和冒号(:)结合使用来分隔语句,如下所示:
如果情况不好,那就做点什么:做另一件事 在这种情况下,我之所以说您应该避免使用单行版本,是因为它变得非常难读懂,而且不是每个人都熟悉使用冒号(:)将多个语句放在同一行()

脚注:
*:如第2部分所述,您不必绝对切换,但强烈建议您这样做
**:您实际上可以使用

If条件然后做其他事情做其他事情,但出于可读性原因,我不鼓励这样做。

循环之前,需要在单独的一行上有一个
End If
语句,直到
。正如@DecimalTurn所述,在一行上有第一个If语句,因此不需要“End If”行。第二个代码需要“End If”,因为您在“Then”之后使用了单独的一行,所以您需要关闭“If”语句。@DecimalTurn,您可以回答这个问题,所以它不会显得没有答案。@DecimalTurn,我想这个注释很快就会被删除,因为它不会对问题添加任何内容,但我是这里的新手,很难不说谢谢。谢谢你!
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
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
If Condition Then Do_Something End If If Condition Then Do_Something If Condition Then Do_Something Do_Another_Thing End If If Condition Then Do_Something: Do_Another_Thing