我写了一个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
谢谢
答案 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