VBA:AutoFilter返回TRUE; 为每个循环击中每个其他单元格
我试图在另一个子内运行下面的子。
我遇到的问题是wRange.AutoFilter(3, "")
用TRUE
填充wRange中的所有单元格,覆盖之前在其中的数据。
只是为了看看它是否能解决TRUE
问题,我改变了行If wCell = "" Then
If wCell = "True"
,我看到它不会删除每一行,而是每隔一行。
Sub DeleteBlankRows() Dim wRange As Range Dim wRange2 As Range Dim lastrow As Integer lastrow = Range("A7").End(xlDown).Row Set wRange = Range("$C$7:$C$" & lastrow) wRange = wRange.AutoFilter(3, "") Range("$A$10000").Select Selection.End(xlUp).Select If ActiveCell.Row <> 5 Then Set wRange2 = wRange.SpecialCells(xlCellTypeVisible) For Each wCell In wRange2 If wCell = "" Then wCell.EntireRow.DELETE End If Next wCell End If wRange = wRange.AutoFilter(3) End Sub
你能明白为什么会这样做吗?
谢谢你的帮助。
PS作为一个方面说明,我原本有Sub DeleteBlankRows(ByRef wRange)
,它没有问题,我没有说什么wRange2
是。 这两个Dims
都在更大的Sub中表示,但这对我来说没有意义。
如果列C中有问题的单元格实际上是空的,而不是返回“”的公式,则可以使用如下所示的内容:
Sub DeleteBlankRows() Dim wRange As Range Dim lastrow As Long lastrow = Cells(Rows.Count, "A").End(xlUp).Row If lastrow > 7 Then On Error Resume Next Set wRange = Range("C7:C" & lastrow).SpecialCells(xlCellTypeBlanks) On Error GoTo 0 If Not wRange Is Nothing Then wRange.EntireRow.Delete ElseIf lastrow = 7 Then If Len(Range("C7").Value) = 0 Then Rows(7).Delete End If End Sub
当单独删除行时, 始终从下往上工作。 For Each wCell In wRange2
中的For Each wCell In wRange2
是这样的,你从上到下工作。
无论如何,批量删除行将是首选。
Sub DeleteBlankRows() Dim wRange As Range Dim lastrow As Long With ActiveSheet '<-set this worksheet erference properly! If .AutoFilterMode Then .AutoFilterMode = False lastrow = .Range("A7").End(xlDown).Row Set wRange = .Range("$A$7:$C$" & lastrow) With wRange .AutoFilter field:=3, Criteria1:="" With .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) If CBool(Application.Subtotal(103, .Columns(1))) Then .SpecialCells(xlCellTypeVisible).EntireRow.Delete End If End With .AutoFilter field:=3 End With End With End Sub
根据您的示例代码,我已经离开了自动filter,但清除了filter。
检查单元格中是否有任何信息的更好方法是IsEmpty函数:
If IsEmpty(cell(1, 1)) = True wCell.EntireRow.DELETE endif