自动筛选Excel VBA后删除隐藏/不可见行

时间:2014-03-08 21:39:16

标签: excel vba excel-vba

我想这很简单,但由于某种原因它似乎对我不起作用:(

我有以下代码,根据我指定的条件自动过滤数据:

Dim lastrow As Long
lastrow = Sheet2.Cells(Sheet2.Rows.Count, "A").End(xlUp).Row

With Sheet2
    .AutoFilterMode = False

    With .Range("A1:AF" & lastrow)
    .AutoFilter
    .AutoFilter Field:=7, Criteria1:="Yes", Operator:=xlFilterValues

    End With

我现在要做的是删除所有不符合条件的未过滤(隐藏)行。

我到目前为止尝试过:

Sub RemoveHiddenRows 
Dim oRow As Object 
For Each oRow In Sheets("Sheet2").Rows 
If oRow.Hidden Then oRow.Delete 
Next 
End Sub 

但是这段代码的问题在于它只会删除连续隐藏行的每一行,因为即使删除了一行并且所有较低的行都向上移动了一行,每个行都会增加所考虑的行。

如果有可能的话,我更喜欢没有循环的东西,有点像.SpecialCells(xlCellTypeVisible).EntireRow.Delete相反

所有帮助将受到高度赞赏。

2 个答案:

答案 0 :(得分:20)

  

所以我有点想摆脱未过滤数据,而不是试图扭转所有标准并删除可见细胞

我会用这个:

Sub RemoveHiddenRows()
    Dim oRow As Range, rng As Range
    Dim myRows As Range
    With Sheets("Sheet3")
        Set myRows = Intersect(.Range("A:A").EntireRow, .UsedRange)
        If myRows Is Nothing Then Exit Sub
    End With

    For Each oRow In myRows.Columns(1).Cells
        If oRow.EntireRow.Hidden Then
            If rng Is Nothing Then
                Set rng = oRow
            Else
                Set rng = Union(rng, oRow)
            End If
        End If
    Next

    If Not rng Is Nothing Then rng.EntireRow.Delete
End Sub

答案 1 :(得分:0)

我为过滤后的表使用了Dmitry Pavliv的解决方案,它可以工作(谢谢!),但会间歇出现错误:“删除范围类的方法失败”错误。

当仅删除一个隐藏行时,似乎发生了错误。唯一的隐藏行就在表标题的正下方,这可能有意义也可能不重要。

单步执行代码,rng指向正确的单元格,并仅显示单个单元格。使用表而不是命名范围可能是一个问题,尽管其他隐藏行以相同的表格式删除也很好。

在我修改了代码的最后一部分之后,宏运行良好 从这里:

If Not rng Is Nothing Then rng.EntireRow.Delete

对此:

If rng.Rows.Count = 1 Then
   ws.Rows(rng.Row & ":" & rng.Row).Delete
ElseIf rng Is Nothing Then
   rng.EntireRow.Delete
End If

由于某种原因,以这种格式删除该行是可行的。我不太确定为什么。 rng对象指向正确的单元格,我正在使用它来获取行号,因此不确定在rng.entirerow.delete语句中为什么它不起作用。那好吧。遇到许多帖子,但仍存在相同的错误,无法解决。