对于每个循环,仅删除符合条件的一些单元格

时间:2016-04-10 10:02:23

标签: vba excel-vba loops for-loop excel

我写了一个sub来删除所有行,其中A列中的单元格包含全部大写的文本。

当我运行它时,它只会删除一些行,但不会删除所有行。这就好像它没有在整个范围内循环。

Sub changeIt()

Dim iHolder As String, rng As Range

Set rng = Range("A1:A19")

For Each Cell In rng

    iHolder = UCase(Cell)

        If StrComp(Cell, iHolder, vbBinaryCompare) = 0 Then

            Cell.EntireRow.Delete

        End If
Next Cell

End Sub

谢谢

2 个答案:

答案 0 :(得分:3)

For Each替换为For ... Next Step -1

在您的情况下,如果删除该行,则其下方的行会向上移动一个位置。因此,ForEach会跳过某些行,因为它的内部指针始终向前移动一个位置 - 是否有删除。您应该能够轻松地发现用铅笔和纸模拟它的问题。

最简单的解决方案是使用For ... Next

从下到上迭代行
For i = LastRowNumber To FirstRowNumber Step -1
    ...
    If StrComp(...) = 0 Then
        Cell.EntireRow.Delete
    End If        
    ...
Next

答案 1 :(得分:3)

您可能希望仅在一个语句中最大化性能并删除行

所以你可以像下面那样

Sub changeIt()

Dim unionRng As Range, rng As Range

Set rng = Range("A1:A19")
Set unionRng = Range("B1") '"dummy" range, to prevent Union method from failing the first time it's called

For Each cell In rng
    If StrComp(cell, UCase(cell), vbBinaryCompare) = 0 Then Set unionRng = Union(unionRng, cell)
Next cell
If unionRng.Count > 1 Then Intersect(unionRng, rng).EntireRow.Delete ' Intersect method removes the "dummy" range from the one whose rows are to be deleted

End Sub

我也附上了一个“公式”方法,它不会迭代单元格并使用“帮助”列(扫描范围右侧的那一列),因此必须“自由”

Option Explicit

Sub changeIt2()    
Dim rng As Range

Set rng = Range("A1:A19")    
With rng.Offset(, 1)
    .FormulaR1C1 = "=IF(exact(Upper(RC[-1]),RC[-1]),"""",1)"
    .value = .value
    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    .Clear
End With

End Sub