如何在 VBA 中结束 do while 循环
Posted
技术标签:
【中文标题】如何在 VBA 中结束 do while 循环【英文标题】:How to end a do while loop in VBA 【发布时间】:2016-08-24 01:30:52 【问题描述】:我想知道我的编码有什么问题,因为我无法在 Microsoft Excel VBA 中结束我的 do while 循环。如果下一行是空白的,我希望结束这个 do while 循环。
Do While Cells(RowName, 1) <> ""
Name = Cells(RowName, ColumnName)
MsgBox Name
RowName = RowName + 1
Loop
请赐教,我还是个初学者。 MsgBox不断弹出,即使是空白也不会结束。
【问题讨论】:
使用终止符命令,例如Exit Do
或Exit Sub
“空白”是什么意思?空白可以表示IsEmpty()
= true;它可以表示一个空白字符串,例如="";或者对于某些用户来说,它甚至可能意味着单元格中的一个空间。
提示:Do Until IsEmpty(Cells(RowName,1))
@PatricK 仅当 OP 的“空白”表示“空”时才有效。
提示:您可以使用Trim(Cells(RowName,1))
删除字符串中的前导和尾随空格。
【参考方案1】:
"Exit Do" - 您可以在任何希望停止循环的地方使用此命令。
Sub ExitDoSample
Dim rowname As Integer
Dim ColumnName As Integer
rowname = 1
ColumnName = 1
Do While Cells(RowName, 1) <> ""
Name = Cells(rowname, ColumnName).Value
If Name = "" Or IsEmpty(Name) Then
Exit Do
Else
MsgBox Name
End If
rowname = rowname + 1
Loop
End Sub
【讨论】:
谢谢。我通过编码更好地理解了。 在此处发布答案时,您的整个 sub 至少需要缩进一次以触发代码块。Do While Cells(1, 1) <> ""
应改为:Do While Cells(RowName, 1) <> ""
@D_Bester 谢谢。但是,如果我不将 RowName 调暗为 Integer,这有关系吗?
@Linify RowName 应重命名为 RowNum 并声明为 long:Dim RowNum as Long
。有更多行,然后整数可以处理。尽管有可能,但没有理由声明为字符串。它效率不高,因为程序必须不断在字符串和数字之间进行转换。【参考方案2】:
Sankar Balasubramanian 的答案非常接近,但存在一些问题。这就是我将如何做到的。不为空时执行,如果修剪的值为空字符串,则退出执行。
Sub SampleEnding()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim RowNum As Long: RowNum = 1
Dim ColNum As Long: ColNum = 3
Dim Name As String
Do While Not IsEmpty(ws.Cells(RowNum, 1))
If Trim(ws.Cells(RowNum, 1).Value) <> "" Then
Name = ws.Cells(RowNum, ColNum)
MsgBox Name
Else
Exit Do
End If
RowNum = RowNum + 1
Loop
End Sub
RowNum 应始终声明为 Long 以避免溢出错误,因为 Excel 有超过一百万行。
如果你声明和设置一个工作表变量,它会更好更清晰。您应该始终避免不合格的范围/单元格引用。
【讨论】:
第一句编码的excel中是否有多个工作表有关系吗? 你可以有很多工作表;此代码(与您的相同)将在活动工作表上运行。但这样做的好处是您可以指定任何工作表;它不必处于活动状态。 您也可以将列名声明为字符串并指定列字母。这适用于 Cells()。Dim ColumnName As String: ColumnName = "C": Name = ws.Cells(RowNum, ColumnName)
从 C 列获取名称。
请问是否需要添加.Value
,因为我试图删除它并且它在编码中也可以使用?
.Value
在 VBA 中是完全可选的,因为它是默认设置。只是在那里明确。在 VB.net 中它不是可选的,所以我已经习惯了添加它。【参考方案3】:
您正在检查第 1 列中的行 RowName 是否为空白,但您正在从 ColumnName 列中提取名称,这可能不是第 1 列。 所以第1列可能有数据(因此检查通过并且循环继续)但第1列没有。 ColumnName 可能为空白,因此您的消息框显示为空白。 会不会是这个问题?
【讨论】:
以上是关于如何在 VBA 中结束 do while 循环的主要内容,如果未能解决你的问题,请参考以下文章
VBA for Access - Do While 循环停止递减
vba如何把while loop得到的结果放入一个array里?