do while vba(需要理解)

Do while vba (need to understand")

我想做一个循环,但我不明白这是怎么回事。 代码必须从一个 sheet 复制到另一个,直到第一个 sheet 的 A 列中没有空单元格。这个是对的? do while sheets("sheet1").range("a:a")<>0

考虑以下 Do...Loop.

的示例

这个例子;

  • 循环遍历单个列中的每一行,直到值为 0。
  • 打印 Do Loop Iteration x 到 VBE 的 立即 window
  • 使用工作表 1 的 A 列中的示例数据(如下所示)

示例数据

Sub DoLoopExampleFirstZero()
    Dim TargetRow As Long: TargetRow = 1
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    Do While Cells(TargetRow, 1).Value <> 0
        Debug.Print "Do Loop iteration " & TargetRow & ": Value = " & Cells(TargetRow, 1).Value
        TargetRow = TargetRow + 1
    Loop
End Sub

将以下内容输出到立即window:

Do Loop iteration 1: Value = 1
Do Loop iteration 2: Value = 1
Do Loop iteration 3: Value = -1
Do Loop iteration 4: Value = 1

如果您打算循环直到 最后使用的行,您可以稍微修改一下,例如将 0 更改为 "",它正在检查'blank''empty'单元格(简单来说)为条件:

Sub DoLoopExampleLastValue()
    Dim TargetRow As Long: TargetRow = 1
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    Do While Cells(TargetRow, 1).Value <> ""
        Debug.Print "Do Loop iteration " & TargetRow & ": Value = " & Cells(TargetRow, 1).Value
        TargetRow = TargetRow + 1
    Loop
End Sub

将以下内容输出到立即window:

Do Loop iteration 1: Value = 1
Do Loop iteration 2: Value = 7
Do Loop iteration 3: Value = -1
Do Loop iteration 4: Value = 3
Do Loop iteration 5: Value = 0
Do Loop iteration 6: Value = 1
Do Loop iteration 7: Value = 1
Do Loop iteration 8: Value = 0
Do Loop iteration 9: Value = -5
Do Loop iteration 10: Value = 1

为什么 Range("A:A").Value<>0 不起作用?

根据 Do...Loop Statement 文档;

Repeats a block of statements while a condition is True or until a condition becomes True.

Range("A:A").Value<>0 无法评估为 TrueFalse,因为您正在尝试评估整个范围不等于或不包含 0.

在我的示例中,我们使用 行计数器 - TargetRow - 它随着每次迭代而递增,允许我们评估下一行 每次迭代。

注意: 就个人而言,我更喜欢“For...Next”循环来实现您正在做的事情,因为它允许增量作为循环语法的一部分,因此它不需要增加计数器 - 它有一个内置计数器

请参阅 For...Next statement 的文档。

请尝试下一个(改编的)代码:

 Sub TestWhile()
   Dim rng As Range, i As Long
   
   Set rng = Sheets("sheet1").Range("a:a")
        i = 1
        Do While rng.cells(i).value <> ""
            Debug.Print rng.cells(i).value
            i = i + 1
        Loop
 End Sub

Do While 这是一个迭代。所以,它需要一个迭代到 end/exit 的条件。想要检查每个单元格范围值,你应该以某种方式必须引用这样一个单元格。

您的“Do While Loop”语句不完整。检查引用 https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/doloop-statement

您想要的“do while”循环的解决方案可能是:

Public Sub Run()
    Copy "Source", "A:A", "Target", "A1"
End Sub

Private Sub Copy(sourceTab As String, sourceCell As String, targetTab As String, targetCell As String)
    Dim source As Range
    Dim target As Range
    Dim current_cell As Range
 
    Set source = ActiveWorkbook.Sheets(sourceTab).Range(sourceCell)
    Set target = ActiveWorkbook.Sheets(targetTab).Range(targetCell)
    
    Set current_cell = source.Cells(1, 1) 'first column, first row in your range
    Do While current_cell.Value <> ""   'Check if cell is not empty
        target.Value = current_cell.Value 'Copy content to target cell
        Set target = target.Cells(2, 1) 'move target cell up one row
        Set current_cell = current_cell(2, 1) 'move source sell up one row
    Loop
   
End Sub

或者,您可以使用更容易处理的 For-Each 循环。此外,我从必须在 VBA 内定义的硬编码范围地址切换到命名范围,后者可以由 Excel 用户定义,而无需打开 VBA 编辑器。

Public Sub RunAlternative()
    CopyAlternative "source", "target"
End Sub

Private Sub CopyAlternative(sourceListName As String, targetCellName As String)
    Dim source As Range
    Dim target As Range
    Dim cell As Range
    
    Set source = ActiveWorkbook.Names(sourceListName).RefersToRange
    Set target = ActiveWorkbook.Names(targetCellName).RefersToRange
    
    For Each cell In source
        If cell.Value = "" Then Exit For
        
        target.Value = cell.Value
        Set target = target.Cells(2, 1)
    Next

End Sub

此处的其他答案向您展示了如何编写 Do..While 循环代码,但是如果您的 objective 是在第 1 列中搜索零,那么您将搜索所有 A:A,但您应该不要搜索过去的数据存储在 sheet 中的位置。利用 Excel 数据模型,该模型跟踪左上角的矩形,其中包含名为 UsedRange 的工作 sheet 变量中的实际数据。有了这个数字,在 For..Next 循环中编写代码就更自然了。

For i=1 to myWorksheet.UsedRange.Rows.Count
    If myWorksheet.Cells(i,1).Value = 0 Then 
        <code here when zero is found>
        Exit For   ' Put this in if you only want the first matching entry
    End If
Next i
If i>myWorksheet.UsedRange.Rows.Count Then MsgBox "No zeros found"

最后一行是 VBA 中的惯用方式,用于检测是否执行了 EXIT FOR 或您掉入了循环底部。