【问题标题】:For Loop not iterating VBAFor循环不迭代VBA
【发布时间】:2021-04-27 08:28:27
【问题描述】:

如果第 i 行第 2 列和第 i 行第 3 列中的值为空,我将尝试删除整行。我的 for 循环只迭代一次。知道为什么吗?


Sub DeleteEm()

RowCount = Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To RowCount
    If IsEmpty(Cells(i, 2).Value) = True And IsEmpty(Cells(i, 3).Value) = True Then
        Rows(i).EntireRow.Delete
    End If
Next i

End Sub

谢谢!

【问题讨论】:

  • 也许 Row.Count 在您拥有数据的下方包含一些空白行。你能简单地使用RowCount = Rows.Count 吗?

标签: excel vba for-loop


【解决方案1】:

您犯了一个错误,这对于 VBA 的新手来说很常见。要更正错误,您需要更改

For i = 2 To RowCount

For i = RowCount to 2 Step -1

您的原始代码正在删除您正在迭代的范围内的行。

考虑当 i=4 并删除与 i 对应的行时会发生什么。第 4 行被删除。原来的第 5 行现在变成了第 4 行,但在 Next 时,i 变成了 5,所以我现在指向起始范围内的第 6 行,跳过了之前的第 5 行,因为那变成了第 4 行。

如果您在查看工作表的同时使用 F8 单步执行代码,您会看到这一切都在您眼前发生。

【讨论】:

  • 这很有意义!我在编写脚本时多次遇到这个“初学者错误”(对于我没有包含的代码)。当然,我的数据不断变化的位置(列)!谢谢!!
  • 我对我的脚本进行了这个更改并且它有效,但是,我不明白为什么它只在我们从 RowCount 开始到 2 Step -1 而不是 2 到 RowCount Step 1 时才有效?自从您从 RowCount 开始以来,我认为消极的步骤只是让它向后循环。
  • 阅读我对为什么您的原始代码再次错误的描述。如果您仍然不明白,这可能是您应该放弃编程的提示。
  • 现在放弃编程!非常感谢您的帮助。
【解决方案2】:

删除两列中包含空单元格的行

  • 您还可以考虑使用Application.Union 来“收集”一个范围内的行范围,然后一次性删除该范围。

守则

Option Explicit

Sub DeleteEm()

    RowCount = Cells(Rows.Count, "A").End(xlUp).Row
    
    Dim rng As Range
    For i = 2 To RowCount
        ' Considering 'blank cells = empty cells + ""-cells'.
        ' Either (For empty cells)...
        If IsEmpty(Cells(i, 2)) And IsEmpty(Cells(i, 3)) Then
        ' ...or (for blank cells)
        'If Len(Cells(i, 2)) = 0 And Len(Cells(i, 3)) = 0 Then
            If rng Is Nothing Then
                Set rng = Rows(i)
            Else
                Set rng = Union(rng, Rows(i))
            End If
        End If
    Next i
    If Not rng Is Nothing Then
        rng.Delete
    End If

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2021-08-18
    • 2012-01-05
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多