VBA代码似乎被困在End If

时间:2018-04-03 16:51:12

标签: vba excel-vba excel

我想在列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

1 个答案:

答案 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起作用。