【问题标题】:Using IsEmpty to stop loop使用 IsEmpty 停止循环
【发布时间】:2017-03-22 23:49:05
【问题描述】:

我在Excel VBA: Loop through cells and copy values to another workbook 找到了一个直接应用于我正在尝试构建的代码的线程。

Sub test()

Dim ws1 As Worksheet, ws2 As Worksheet
Dim CurCell_1 As Range, CurCell_2 As Range
Dim Ran As Range
Dim Group As Range, Mat As Range

Application.ScreenUpdating = True

Set ws1 = ActiveWorkbook.Sheets("Scrap")
Set ws2 = ActiveWorkbook.Sheets("FC Detail")

For Each Mat In ws1.Range("E:E")
    Set CurCell_2 = ws2.Range("F8")
    For Each Group In ws1.Range("E:E")
        Set CurCell_1 = ws1.Cells(Group.Row, Mat.Column)
        If Not IsEmpty(CurCell_2) Then
            CurCell_2.Value = CurCell_1.Value
        End If
    Next
Next

End Sub

这段代码有一个例外,它不断循环。

我认为If Not IsEmpty 将是 VBA 的描述符,一旦它到达列表末尾以停止程序。

【问题讨论】:

  • “不断循环”是什么意思?如果代码从不退出循环,你怎么知道它“有效”?
  • 它一直在运行,因为您正在处理整个列...两次。为什么不找到最后一行然后限制你的范围,如另一个链接所示?

标签: vba excel


【解决方案1】:

除了我的评论,试试这个。这样会快很多

Sub Test()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim CurCell_1 As Range, CurCell_2 As Range
    Dim Group As Range, Mat As Range, Ran As Range
    Dim lRow As Long

    Set ws1 = ActiveWorkbook.Sheets("Scrap")
    Set ws2 = ActiveWorkbook.Sheets("FC Detail")

    With ws1
        lRow = .Range("E" & .Rows.Count).End(xlUp).Row

        Set Ran = .Range("E1:E" & lRow)

        For Each Mat In Ran
            Set CurCell_2 = ws2.Range("F8")
            For Each Group In Ran
                Set CurCell_1 = .Cells(Group.Row, Mat.Column)
                If Not IsEmpty(CurCell_2) Then
                    CurCell_2.Value = CurCell_1.Value
                End If
            Next
        Next
    End With
End Sub

【讨论】:

  • +1。 Colin,如果你做任何 Excel VBA 开发,找到最后一行是你一直都会做的事情。 Siddharth 在上面的代码中找到它的方式是你应该记住的。您还需要养成单步执行代码 (F8) 以查看其实际执行情况的习惯。
  • 说到好习惯,把DoEvents放在所有循环中,尤其是在开发过程中。这样你就可以在无限循环的情况下随时闯入。
  • 非常感谢您的帮助,稍作修改后效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
相关资源
最近更新 更多