【问题标题】:How to end a do while loop in VBA如何在 VBA 中结束 do while 循环
【发布时间】: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)) 删除字符串中的前导和尾随空格。

标签: excel vba loops


【解决方案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 可能为空白,因此您的消息框显示为空白。 会不会是这个问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-26
    • 2018-04-06
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    相关资源
    最近更新 更多