VBA 每个循环都没有执行正确的操作

VBA for each loop not doing the correct action

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

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

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

有什么建议吗?

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

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

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

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

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