【问题标题】:Delete Hidden/Invisible Rows after Autofilter Excel VBA自动筛选 Excel VBA 后删除隐藏/不可见行
【发布时间】:2014-03-08 21:39:15
【问题描述】:

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

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

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相反@

所有帮助将不胜感激。

【问题讨论】:

  • 为什么不把条件改为Criteria1:="<>Yes",然后.SpecialCells(xlCellTypeVisible).EntireRow.Delete
  • @simoco 在这种情况下它会起作用,但在其他情况下,我会根据 3 或 4 个多个条件过滤数据,有时每个条件都携带超过 1 个值。所以我有点想摆脱未过滤的数据,而不是试图颠倒所有标准并删除可见单元格。有什么建议吗?
  • 只需遍历行并检查是否.Hidden = True,然后删除那些。如果您不想要删除循环,请对隐藏行执行 Union 循环,然后一次性删除它们。

标签: vba excel


【解决方案1】:

所以我有点想摆脱未过滤的数据,而不是试图颠倒所有标准并删除可见单元格

我会用这个:

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

【讨论】:

  • @simoco +1 完美!正是我想要的:)
  • 我复制粘贴它并得到一个错误,但修复它只需要将Sheets("Sheet3")替换为ActiveSheet。像魅力一样工作!
【解决方案2】:

我对过滤表使用了 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 语句中不起作用。那好吧。分享时遇到了许多相同错误未解决的帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多