如何在 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 DoExit 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) &lt;&gt; "" 应改为:Do While Cells(RowName, 1) &lt;&gt; "" @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里?

VBA 中 do while loop 用法

VBA学习笔记之循环

Python入门教程第57篇 循环进阶之模拟do…while语句

Excel VBA结束选择没有选择案例