Excel 2013 VBA清除所有过滤器宏

时间:2014-02-13 17:17:31

标签: excel vba excel-vba excel-vba-mac

似乎较旧的宏无效。我有适当的安全设置来运行VBA宏但是当我尝试了一些方法来清除工作表上的所有过滤器时,我收到编译错误。

以下是我的尝试:


Sub AutoFilter_Remove()
'This macro removes any filtering in order to display all of the data but it does not remove the filter arrows
ActiveSheet.ShowAllData
End Sub

我在工作表上有按钮以清除所有过滤器,以方便用户使用,因为工作表中有很多列都有过滤器。

25 个答案:

答案 0 :(得分:51)

试试这个:

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData

答案 1 :(得分:30)

如果工作表上已有过滤器,则:

Sub Macro1()
    Cells.AutoFilter
End Sub

将删除它。

答案 2 :(得分:26)

如果当前未应用过滤器,则ShowAllData将引发错误。这将有效:

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

答案 3 :(得分:16)

对于表格,请尝试检查它是否已开启并关闭:

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

重新开启:

wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter

答案 4 :(得分:9)

这很好用。!

If ActiveSheet.AutoFilterMode Then Cells.AutoFilter

答案 5 :(得分:5)

我发现这种解决方法非常有效。它基本上从表中删除自动过滤器,然后重新应用它,从而删除任何以前的过滤器。根据我的经验,这里提到的其他方法不需要进行错误处理。

Set myTable = YOUR_SHEET.ListObjects("YourTableName")

myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True

答案 6 :(得分:4)

这很棒,我找到的唯一答案符合我的特殊需要,非常感谢你提出这个问题!

我只做了一个小小的补充,以便屏幕不会闪烁,它会删除并随后在每张纸上重新应用密码,因为它循环显示[我对工作簿中的所有工作表都有相同的密码]。根据你提交的精神,我加上这个来帮助其他人......

db.history.aggregate([
    {
        "$match":{ "objectClass": "AAA\BBB\CCC" }
    },{
        "$sort": {"version":-1} 
    },{
        "$group":{
            "_id":"$objectId",
            "objectClass": {"$first": "$objectClass"},
            "version": {"$first": "$version"},
            "origId": {"$first": "$_id"},
            "fields": {"$first": "$fields"}
        }
    },{
        "$project":{
            "_id":"$origId",
            "objectId": "$_id",
            "objectClass":1,
            "version": 1,
            "fields": 1
        }
    }
])

我知道这是一个相对古老的帖子,并不像是一个死灵法师......但是因为我遇到了同样的问题并尝试了一些选项而没有成功,我结合了一些答案得到一个有效的宏..

希望这可以帮助那些人:)

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

答案 7 :(得分:3)

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

这将显示所有数据,并删除下拉按钮。在堆叠(复制和粘贴)来自多个工作表或工作簿的数据时,它非常方便。希望这会有所帮助。

答案 8 :(得分:3)

我通常使用此代码

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

答案 9 :(得分:3)

这也可以:

If ActiveSheet.FilterMode Then cells.AutoFilter

答案 10 :(得分:2)

这将首先检查是否设置了AutoFilterMode(可以进行过滤),然后检查FilterMode是否已打开(您正在过滤某些内容),然后关闭过滤。

关于错误,即保护 - 其他答案

添加了上下文(我的脚本循环显示工作表,然后保存为CSV,因此需要删除过滤器 - 但保持AutoFilterMode,如果设置:

For Each WS In ActiveWorkbook.Worksheets
  Select Case WS.Name
    Case "01", "02", "03", "04", "05"
      With WS
        If WS.AutoFilterMode Then
            If WS.FilterMode Then WS.ShowAllData
        End If

        ' Processing data
      End With
    Case Else
      ' Nothing to see here
  End Select
Next

答案 11 :(得分:1)

尝试这样的事情:

Sub ClearDataFilters()
'Clears filters on the activesheet. Will not clear filters if the sheet is protected.
On Error GoTo Protection
If ActiveWorkbook.ActiveSheet.FilterMode Or _
   ActiveWorkbook.ActiveSheet.AutoFilterMode Then _
   ActiveWorkbook.ActiveSheet.ShowAllData

Exit Sub
Protection:
If Err.Number = 1004 And Err.Description = _ 
    "ShowAllData method of Worksheet class failed" Then
    MsgBox "Unable to Clear Filters. This could be due to protection on the sheet.", _
    vbInformation
End If

End Sub
如果工作表处于过滤模式,则

.FilterMode返回true。 (See this了解更多信息。)
有关.AutoFilter的更多信息,请See this 最后,this将提供有关.ShowAllData方法的更多信息。

答案 12 :(得分:0)

哇。之后登录将删除第一行的一部分。我的错。但是,这很简洁。

对于两个测试 在Sheet1的A1和A5中输入文本 仅过滤空白。 运行任一测试 在A5中输入文字 尝试过滤!

Sub SubsequentFilterFails()
   With Sheet1     'assumes code name is still Sheet1
      .ShowAllData  'assumes a filter has been applied
      .Range(.Cells(2, 1), .Cells(7, 1)).EntireRow.Delete
   End With
End Sub

Sub SubsequentFilterWorks()
   With Sheet1
      .Cells.AutoFilter
      .Range(.Cells(2, 1), .Cells(7, 1)).EntireRow.Delete
      .Cells.AutoFilter
   End With
End Sub

因此,在清除过滤器以清理工作表时,将使用Cells.AutoFilter。

答案 13 :(得分:0)

我将这种方法用于多表和范围表,这是一种独特的方法。

DataSource

答案 14 :(得分:0)

这最适合我。

在保存和关闭文件之前,我通常使用以下内容。

Sub remove_filters

ActiveSheet.AutofilterMode = False

End Sub

答案 15 :(得分:0)

仅当您有过滤器时此选项才会清除,并且在没有任何过滤器时不会导致任何错误。 如果为ActiveSheet.AutoFilterMode,则为ActiveSheet.Columns(“ A”)。AutoFilter

答案 16 :(得分:0)

您需要的是:

    ActiveSheet.AutoFilter.ShowAllData

为什么?像工作表一样,自动筛选器也具有ShowAllData方法,但是即使在没有活动筛选器的情况下启用了自动筛选器,它也不会引发错误。

答案 17 :(得分:0)

循环自动过滤器列,如果已激活(打开)列,然后重置列过滤器,则可以在循环后插入新条件。此代码不会删除自动筛选横幅。

Dim iCol as Long
Dim ws as Worksheet
...
For iCol = 1 To ws.AutoFilter.Filters.count
  If ws.AutoFilter.Filters(iCol).On Then ws.AutoFilter.Range.AutoFilter Field:=iCol
Next
...
ws.AutoFilter.Range.AutoFilter Field:=4, Criteria1:="AABBCC"

答案 18 :(得分:0)

这个帖子很古老,但我对任何给定的答案都不满意,最后写了自己的答案。我现在正在分享它:

我们从:

开始
  Sub ResetWSFilters(ws as worksheet)
             If ws.FilterMode Then   
     ws.ShowAllData   
     Else   
     End If  
    'This gets rid of "normal" filters - but tables will remain filtered
    For Each listObj In ws.ListObjects 
               If listObj.ShowHeaders Then   
                    listObj.AutoFilter.ShowAllData
                    listObj.Sort.SortFields.Clear    
               End If     
       Next listObj
        'And this gets rid of table filters
        End Sub

我们可以将特定工作表提供给此宏,该宏将仅对该工作表进行不过滤。如果你需要确保只有一个工作表是清楚的,这很有用。但是,我通常想要完成整个工作簿

Sub ResetAllWBFilters(wb as workbook)
  Dim ws As Worksheet  
  Dim wb As Workbook  
  Dim listObj As ListObject    

       For Each ws In wb.Worksheets  
          If ws.FilterMode Then 
          ws.ShowAllData  
          Else   
          End If   
 'This removes "normal" filters in the workbook - however, it doesn't remove table filters           
   For Each listObj In ws.ListObjects 
        If listObj.ShowHeaders Then   
             listObj.AutoFilter.ShowAllData 
             listObj.Sort.SortFields.Clear    
        End If     
   Next listObj

        Next   
'And this removes table filters. You need both aspects to make it work.  
    End Sub

您可以使用此功能,例如,在执行任何操作之前打开您需要处理的工作簿并重置其过滤器:

Sub ExampleOpen()
Set TestingWorkBook = Workbooks.Open("C:\Intel\......") 'The .open is assuming you need to open the workbook in question - different procedure if it's already open
Call ResetAllWBFilters(TestingWorkBook)
End Sub

我最常用的一个:重置存储模块的工作簿中的所有过滤器:

Sub ResetFilters()
      Dim ws As Worksheet  
      Dim wb As Workbook  
      Dim listObj As ListObject  
       Set wb = ThisWorkbook  
       'Set wb = ActiveWorkbook
       'This is if you place the macro in your personal wb to be able to reset the filters on any wb you're currently working on. Remove the set wb = thisworkbook if that's what you need
           For Each ws In wb.Worksheets  
              If ws.FilterMode Then 
              ws.ShowAllData  
              Else   
              End If   
     'This removes "normal" filters in the workbook - however, it doesn't remove table filters           
       For Each listObj In ws.ListObjects 
            If listObj.ShowHeaders Then   
                 listObj.AutoFilter.ShowAllData 
                 listObj.Sort.SortFields.Clear    
            End If     
       Next listObj

            Next   
'And this removes table filters. You need both aspects to make it work.  
    End Sub

答案 19 :(得分:0)

以下是修复过滤器的一些代码。例如,如果您打开工作表中的过滤器,然后添加一列,那么您希望新列也被过滤器覆盖。

Private Sub AddOrFixFilters()

    ActiveSheet.UsedRange.Select

    ' turn off filters if on, which forces a reset in case some columns weren't covered by the filter
    If ActiveSheet.AutoFilterMode Then
        Selection.AutoFilter
    End If

    ' turn filters back on, auto-calculating the new columns to filter
    Selection.AutoFilter

End Sub

答案 20 :(得分:0)

试试这个:

Sub ResetFilters()
    Dim ws                    As Worksheet
    Dim wb                    As Workbook
    Dim listObj               As ListObject

    For Each ws In ActiveWorkbook.Worksheets
        For Each listObj In ws.ListObjects
            If listObj.ShowHeaders Then
                listObj.AutoFilter.ShowAllData
                listObj.Sort.SortFields.Clear
            End If
        Next listObj
    Next ws
End Sub

此代码清除所有过滤器并删除排序。

来源:Removing Filters for Each Table in a Workbook, VBA

答案 21 :(得分:0)

我使用.filtermode如果过滤器打开则返回true

Dim returnValue As Boolean
    returnValue = worksheet1.FilterMode

    if returnValue Then
    worksheet1.ShowAllData
    End If

答案 22 :(得分:0)

只需激活过滤器标题并运行showalldata,即可100%运行。类似的东西:

Range("A1:Z1").Activate
ActiveSheet.ShowAllData

Range("R1:Y1").Activate
ActiveSheet.ShowAllData

如果A1:Z1和R1:Y1分别有字段标题。

答案 23 :(得分:-1)

我在Microsoft webpage

中找到了这个答案

它使用AutoFilterMode作为布尔值。

   If Worksheets("Sheet1").AutoFilterMode Then Selection.AutoFilter

答案 24 :(得分:-2)

使用ActiveSheet.ShowAllData

之前,必须先选择表的范围