Excel 2013 VBA 清除所有筛选宏

45
似乎旧的宏无法工作。我已经设置了适当的安全性来运行VBA宏,但是当我尝试清除工作表上的所有筛选器时,我遇到了编译错误。
以下是我尝试过的内容:
子程序AutoFilter_Remove() “此宏删除任何筛选以显示所有数据,但不删除筛选箭头” ActiveSheet.ShowAllData 结束子
我在工作表上放置了按钮以清除所有筛选,以方便用户使用,因为该工作表有许多带有筛选器的列。

2
仅使用AutoFilter对象的ShowAllData方法而不是工作表本身,就可以将整个线程缩短为一个答案...ActiveSheet.AutoFilter.ShowAllData - John Joseph
26个回答

62

试一下这个:

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData

@Rafiki 有点晚了,但是...你提到的问题的一些解决方案在这里讨论:https://dev59.com/XGMl5IYBdhLWcg3wqIdh - eirikdaude
1
我的回答也解决了那个问题。不过我想我会在那个问题中分享它。 - BobbyA

34

如果当前未应用筛选器,ShowAllData将抛出错误。以下内容可行:

Sub ResetFilters()
    On Error Resume Next
    ActiveSheet.ShowAllData
End Sub

1
这个解决方案完美地达到了我的预期。它重新初始化了所有的自动筛选器,而不是像 Cell.Autofilter 那样移除它们。 - jomuller
1
它还会从所有数据透视表中删除筛选器,这并不是要求的,并且甚至可以覆盖现有数据。 - moodymudskipper
3
ActiveSheet.ShowAllData会在什么情况下"覆盖现有数据"? - BobbyA
1
@BobbyA 如果您在数据透视表中选择一个单元格,然后执行 ActiveSheet.ShowAllData。它将重置数据透视表的筛选器。 - Winand
2
@Winand,我可能误解了您的陈述,但重置数据透视表筛选器是预期的行为。 - BobbyA
@BobbyA ActiveSheet.ShowAllData 可以在这种情况下“覆盖现有数据”。虽然我在这里看不出问题。 - Winand

32
如果工作表已经设置筛选器,则:
Sub Macro1()
    Cells.AutoFilter
End Sub

删除它


11
这个解决方案完全删除了表格中的“自动筛选”...看起来您需要保留“自动筛选”,但是清除筛选,对吗? - ARich

19

对于表格,请尝试使用以下方法检查其是否开启并关闭:

If wrkSheetCodeName.ListObjects("TableName").ShowAutoFilter Then
    wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
End if

重新启用的方法:
wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter

11

这个很棒!

If ActiveSheet.AutoFilterMode Then Cells.AutoFilter

7

太棒了,这是我找到的唯一符合我特定需求的答案,非常感谢你提供它!

我只进行了一点小修改,以便屏幕不会闪烁,并在每个工作表循环时删除并随后重新应用密码[我对工作簿中所有工作表都使用相同的密码]。顺着您的思路,我添加了这个来帮助其他人....

Sub ClearFilters()
    Application.ScreenUpdating = False

    On Error Resume Next
    For Each wrksheet In ActiveWorkbook.Worksheets
        'Change the password to whatever is required
        wrksheet.Unprotect Password:="Albuterol1"
        wrksheet.ShowAllData 'This works for filtered data not in a table

        For Each lstobj In wrksheet.ListObjects
            If lstobj.ShowAutoFilter Then
                lstobj.Range.AutoFilter 'Clear filters from a table
                lstobj.Range.AutoFilter 'Add the filters back to the table
            End If

        'Change the password to whatever is required
        wrksheet.Protect Password:="Albuterol1", _
              DrawingObjects:=True, _
              Contents:=True, _
              Scenarios:=True, _
              AllowFiltering:=True
        Next 'Check next worksheet in the workbook
    Next

    Application.ScreenUpdating = True
End Sub

我知道这篇文章比较老了,我不想成为一个死灵法师...但是由于我遇到了相同的问题并尝试了这篇主题中的一些选项却没有成功,所以我结合了一些答案来获得一个可行的宏。

希望这能帮助到有需要的人 :)

Sub ResetFilters()
    On Error Resume Next
    For Each wrksheet In ActiveWorkbook.Worksheets
        wrksheet.ShowAllData 'This works for filtered data not in a table
        For Each lstobj In wrksheet.ListObjects
            If lstobj.ShowAutoFilter Then
                lstobj.Range.AutoFilter 'Clear filters from a table
                lstobj.Range.AutoFilter 'Add the filters back to the table
            End If
        Next 'Check next worksheet in the workbook
    Next
End Sub

6

Excel有两种过滤器:

  • 自动筛选
  • 高级筛选

自动筛选功能允许您使用小型下拉按钮从Excel界面进行筛选。而高级筛选功能允许您使用条件范围进行筛选。

ShowAll方法可以删除筛选器,也就是显示所有行,但不会去掉那些下拉按钮。您必须将工作表的AutoFilterMode属性设置为FALSE才能移除这些按钮。

以下是我经常使用的一个子程序用于删除筛选器:

Sub RemoveFilters(ByRef WhichSheet As Worksheet)

If WhichSheet.FilterMode Then WhichSheet.ShowAllData
If WhichSheet.AutoFilterMode Then WhichSheet.AutoFilterMode = False

End Sub

这将展示所有数据,并移除下拉按钮。在从多个工作表或工作簿复制和粘贴数据时非常方便。希望这有所帮助。

上述对ShowAllData方法的调用是多余的。当您通过将AutoFilterMode设置为False来禁用AutoFilter时,由AutoFilter隐藏的任何行都会自动取消隐藏。此外,如果您只需要取消隐藏隐藏的行(而不删除AutoFilter),那么您只需要调用ShowAllData方法即可。没有必要先检查WhichSheet.FilterMode。 - pstraton
就像我之前说过的,有两种过滤器。如果使用了高级过滤器,则需要使用showall方法。 - Ejaz Ahmed
我不明白重点在哪里。AdvancedFilter不会留下任何需要测试的工作表属性状态。 - pstraton
它确实会更改FilterMode属性。 - Ejaz Ahmed
是的,但它所做的是禁用AutoFilterMode,这会显示所有数据。因此,我认为我的原始观点仍然有效。 - pstraton

5

我发现这种方法非常有效。它基本上是从表中删除自动筛选器,然后重新应用它,从而删除任何先前的过滤器。从我的经验来看,这不容易出现其他方法所需的错误处理。

Set myTable = YOUR_SHEET.ListObjects("YourTableName")

myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True

4
这也可以生效:
If ActiveSheet.FilterMode Then cells.AutoFilter

3

我通常使用这段代码

Sub AutoFilter_Remove()
    Sheet1.AutoFilterMode = False  'Change Sheet1 to the relevant sheet
                                   'Alternatively: Worksheets("[Your Sheet Name]").AutoFilterMode = False
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接