excel - 如何告诉计算机“循环”属于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
亲切的问候费伦茨
解决方案
即使您收到的错误消息是“没有执行的循环”,该错误实际上与您的 If 语句有关,它需要End If
在您希望在您的 If 语句中执行的命令之后加上单独的行。
当这样的标记丢失时,您通常会收到一条不代表实际错误的错误消息,因此在调试时请留意那些丢失的结尾元素(End If
、Next
、Loop
等)!
作为补充,这里讨论了 If 语句的单行版本与多行版本:
1)当条件为真时只有一条语句要执行时:
- 您可以使用最后需要的多行版本
End If
:
如果条件那么 做一点事 万一
- 您可以使用最后不需要的If 语句的单行版本
End If
:
If Condition Then Do_Something
选择哪一个是个人喜好问题。在只有一条语句要执行的情况下,使用单行版本似乎很合适,因为它更整洁。
但是,多行版本仍然更加灵活。例如,想象一下,在路上,您意识到您需要您的 If 语句来执行更多的语句,您将不得不切换回多行版本*。此外,要在条件返回 false 时合并Else
或ElseIf
在代码中执行某些操作,您还需要多行版本**(此处有更多详细信息)。
2) 当条件为真时有多个语句要执行时:
- 您应该像这样使用多行版本:
如果条件那么 做一点事 Do_Another_Thing 万一
- 你可以,但应该避免使用单行版本。但是,如果您真的想这样做,则必须将它与冒号 (:) 结合使用来分隔您的语句,如下所示:
If Condition Then Do_Something: Do_Another_Thing
在这种情况下,我说你应该避免使用单行版本的原因是因为它变得非常难以阅读,而且并不是每个人都熟悉使用冒号(:) 来放置多个语句同一行(此处有更多详细信息)
脚注:
*:如第 2 部分所述,您不必绝对切换,但强烈建议这样做。
**:您实际上可以Else
使用 将 写在同一行
If Condition Then Do_Something Else Do_Something_Else
,但出于可读性原因,我不鼓励这样做。
推荐阅读
- javascript - 我不断收到此错误:不允许加载本地资源
- c# - 如果一个数组包含在另一个数组中,则 dynamodb 扫描
- rust - ARMv7 的独立可执行文件失败,因为它为 libstd “无法打开共享对象文件”
- c++ - 如何从字符串数组转换为字符数组数组?
- amazon-ec2 - 如何将社区版 sonarqube aws 实例替换为开发者版?
- swift - 如何在swift中选择aTableView部分中的单元格
- python - 站点包文件夹存在于 python2 但不存在于 python3
- shopify - Shopify 产品/更新 webhook 在库存更改时触发
- android - ConstraintSet.connect() 中的边距参数是 px 还是 dp?
- asp.net-core - 将启用 OData 的 api 控制器转换为将输出 json 格式为 TitleCase 而不是驼峰式大小写