我想在列B中循环并删除B列中包含空单元格的所有行,但它似乎卡在End If部分(无错误消息)
Dim lastrow As Long
With ActiveSheet
lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
Dim i As Integer
i = 2
Do While i <= lastrow
If Range("B" & i) = "" Then
ws.Rows(i).Delete
Else
i = i + 1
End If
Loop
End Sub
答案 0 :(得分:3)
由于您知道在开始循环之前需要多少次迭代,因此请使用For
循环。
当您遇到要删除的行时,Union
将其与您要删除的其他行相关联。
一旦您标记了要删除的所有行,请在一次操作中将其删除。
Dim marked As Range
Dim i As Long
For i = 1 To lastRow
If ActiveSheet.Range("B" & i).Value = "" Then
If marked Is Nothing Then
Set marked = ActiveSheet.Range("B" & i)
Else
Set marked = Union(marked, ActiveSheet.Range("B" & i))
End If
End If
Next
If Not marked Is Nothing Then marked.EntireRow.Delete
这应该明显快于反向迭代行并逐个删除它们。
注意:
i
被声明为As Long
,因为Integer
将超过32,767;工作表可以有更多行。Range
次调用均已ActiveSheet
明确限定。不合格的Range
调用隐式引用ActiveSheet
...除非您在工作表的代码隐藏中,在这种情况下,他们会引用该工作表。最好让代码完成它所说的内容,并说出它的作用。ws
的含义是什么,因为它在您的代码中没有任何地方,无论如何(隐式或明确地),一切都在ActiveSheet
起作用。