Excel 2013 VBA清除所有筛选器宏

Excel 2013 VBA Clear All Filters macro

似乎旧的宏无法正常工作。 我已经设置了适当的安全性来运行VBA宏,但是当我尝试了几种清除工作表上所有筛选器的方法时,出现编译错误。

这是我尝试过的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <wyn>
子AutoFilter_Remove()
"此宏会删除所有过滤条件以显示所有数据,但不会删除过滤器箭头
ActiveSheet.ShowAllData
结束子
</ pre> </ CODE>
</p>

<p>
我在工作表上有按钮,可以清除所有过滤器,以方便用户使用,因为工作表上有很多带有过滤器的列。
</p><div class="suo-content">[collapse title=""]<ul><li>
仅使用AutoFilter对象的ShowAllData方法而不是工作表本身,就可以将整个线程缩短为一个答案... ActiveSheet.AutoFilter.ShowAllData</li></ul>[/collapse]</div><hr>
<p>
试试这个:
</p>

[cc]If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData


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

1
2
3
Sub Macro1()
    Cells.AutoFilter
End Sub

将其删除。


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

1
2
3
4
Sub ResetFilters()
    On Error Resume Next
    ActiveSheet.ShowAllData
End Sub


对于表,请尝试检查其是否打开并关闭:

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

要重新打开:

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

这很好用!

1
If ActiveSheet.AutoFilterMode Then Cells.AutoFilter

那真是太好了,这是我找到的满足我特定需求的唯一答案,非常感谢!

我对其进行了少量添加,以使屏幕不闪烁,并且在循环显示[我在工作簿中的所有工作表都具有相同的密码]时,屏幕上的密码不会被删除,随后在每张工作表上重新应用密码。本着您提交的精神,我补充一下以帮助其他任何人。...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

我知道这是一个相对较旧的文章,并不真的很喜欢做一个死灵法师……但是由于我遇到了同样的问题,并尝试了该线程中的一些选项而没有成功,所以我结合了一些答案以得到一个有效的宏..

希望这可以帮助某人:)

1
2
3
4
5
6
7
8
9
10
11
12
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

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

1
2
3
4
Set myTable = YOUR_SHEET.ListObjects("YourTableName")

myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True

Excel中有两种类型的过滤器:

  • 自动筛选
  • 进阶筛选

自动筛选功能使您可以使用那些小的下拉按钮从excel界面进行筛选。而且,高级过滤器功能使您可以使用条件范围进行过滤。

ShowAll方法删除过滤器,如所示,显示所有行,但不消除那些"下拉"按钮。您必须将工作表的AutoFilterMode属性设置为FALSE才能删除那些按钮。

这是我经常用来删除过滤器的Sub:

1
2
3
4
5
6
Sub RemoveFilters(ByRef WhichSheet As Worksheet)

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

End Sub

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


这也将起作用:

1
If ActiveSheet.FilterMode Then cells.AutoFilter

我通常使用此代码

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

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

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

添加了上下文(我的脚本在工作表上循环,然后将其另存为CSV,因此需要删除过滤器-但如果设置了AutoFilterMode,则保持打开状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

所有你需要的是:

1
    ActiveSheet.AutoFilter.ShowAllData

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


尝试这样的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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。 (有关更多信息,请参见此。)
有关.AutoFilter的更多信息,请参见此内容。
最后,这将提供有关.ShowAllData方法的更多信息。


这对我来说最有效。

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

1
2
3
4
5
Sub remove_filters

ActiveSheet.AutofilterMode = False

End Sub

这是我使用的单线。它检查是否有自动过滤器,如果找到,则将其删除。

与某些答案不同的是,如果该代码用于最初未进行自动过滤的工作表,则不会创建自动过滤器。

1
If Cells.AutoFilter Then Cells.AutoFilter

只需激活过滤器标题并运行showalldata,即可100%运行。就像是:

1
2
3
4
5
Range("A1:Z1").Activate
ActiveSheet.ShowAllData

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

如果字段头分别位于A1:Z1和R1:Y1中。


我在过滤器上使用.FilterMode返回true

1
2
3
4
5
6
Dim returnValue As Boolean
    returnValue = worksheet1.FilterMode

    if returnValue Then
    worksheet1.ShowAllData
    End If

试试这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

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

来源:为工作簿中的每个表删除筛选器,VBA


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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

这个线程很古老,但是我对任何给出的答案都不满意,最终自己写了一个。我现在分享:

我们从开始:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  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

我们可以向该宏提供特定的工作表,该工作表将仅过滤该工作表。如果您需要确保只清除一个工作表,则很有用。但是,我通常想做整个工作簿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

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

1
2
3
4
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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

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


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

1
2
3
4
5
6
7
8
9
10
Sub RemoveFilters(Ws As Worksheet)
Dim LO As ListObject
On Error Resume Next
    Ws.ShowAllData
    For Each LO In Ws.ListObjects
        LO.ShowAutoFilter = True
        LO.AutoFilter.ShowAllData
    Next
    Ws.ShowAllData
End Sub

我在Microsoft网页中找到了这个答案

它使用AutoFilterMode作为布尔值。

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

使用ActiveSheet.ShowAllData之前,必须先选择表的范围