2016-04-10 47 views
0

我写了一个子集,用于删除列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 

谢谢

回答

3

更换For EachFor ... NextStep -1

在你的情况下,如果你删除该行,它下面的行向上移动一个位置。因此你的ForEach跳过一些行,因为它的内部指针总是向前移动一个位置 - 不管是否删除。你应该能够很容易地发现用铅笔和纸模拟它的问题。

最简单的解决方案是从底部重复行使用For ... Next

For i = LastRowNumber To FirstRowNumber Step -1 
    ... 
    If StrComp(...) = 0 Then 
     Cell.EntireRow.Delete 
    End If   
    ... 
Next 
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 

I en也关闭了一个“公式”方法,它不会遍历单元格并使用“助手”列(要扫描范围右侧的那一列),因此它必须是“空闲”的。

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 
相关问题