【问题标题】:VBA for each loop not doing the correct action每个循环的 VBA 没有执行正确的操作
【发布时间】:2021-09-06 09:27:50
【问题描述】:

我有这段代码,它应该循环遍历特定范围内的所有行,如果满足条件,它应该删除整行。

Sub zakat()
Dim cell As Range
Dim last As String

Sheets("payment sheet").Activate

Cells.EntireColumn.AutoFit

last = ActiveSheet.Range("A1").CurrentRegion.Rows.Count

Debug.Print (last)

For Each cell In Range("M2:M" & last)

If cell.Text Like "*4435*" Or cell.Text Like "*1292*" Or cell.Text Like "*1293*" Then

cell.Select
Selection.EntireRow.Select
Selection.Delete Shift:=xlUp


End If
Next cell


End Sub

我只是尝试用黄色突出显示条件是否满足而不删除事务只是为了测试它是否循环遍历所有记录并正确识别它们,并且它确实突出显示了所有记录而没有问题。只是当我要求它删除行时,它并没有删除所有行,它只删除了几乎一半的下摆!

有什么建议吗?

【问题讨论】:

  • 删除行时,从最后一个迭代到第一个。

标签: excel vba foreach


【解决方案1】:

这是我们大多数人在某个时候遇到过的常见困难!
删除一行时,通常它下面的所有行都会上移。但是,循环将移动到“下一个”行,而不是检查替换它删除的行的行。
为了克服这个问题,从底部开始向后运行循环,如下所示:

For a = Last to 2 Step -1 
    If Range("M" & a) Like "*4435*" Or _
        Range("M" & a) Like "*1292*" Or _
        Range("M" & a) Like "*1293*" Then _
    Rows(a).Delete shift:=xlUp
Next

【讨论】:

    【解决方案2】:

    删除您在循环中迭代的单元格总是会导致问题。一旦你删除了第一个,你就搞乱了所有后续的引用。

    我发现一个更好的解决方案是通过索引进行迭代,通过计数向后 - 这样,后续引用不受影响。

    For i = last To 1 Step -1
      If .... Then 
        Cells(i,1).EntireRow.Delete Shift:=xlUp
      End If
    Next i
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2021-09-11
      相关资源
      最近更新 更多