Excel 2013 VBA清除所有过滤器宏

Excel 2013 VBA清除所有过滤器宏,excel,vba,macos,Excel,Vba,Macos,看来旧的宏不起作用了。我有适当的安全设置来运行VBA宏,但是当我尝试了一些方法来清除工作表上的所有过滤器时,我得到了一个编译错误 以下是我尝试过的: 子自动过滤器_删除() '此宏删除任何筛选以显示所有数据,但不删除筛选箭头 ActiveSheet.ShowAllData 端接头 我在工作表上有按钮来清除所有过滤器,以便于用户使用,因为工作表上有很多列都有过滤器。如果工作表上已经有过滤器,那么: Sub AutoFilter_Remove() 'This macro removes any

看来旧的宏不起作用了。我有适当的安全设置来运行VBA宏,但是当我尝试了一些方法来清除工作表上的所有过滤器时,我得到了一个编译错误

以下是我尝试过的:

子自动过滤器_删除() '此宏删除任何筛选以显示所有数据,但不删除筛选箭头 ActiveSheet.ShowAllData 端接头


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

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

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 将删除它

尝试以下操作:

Sub Macro1()
    Cells.AutoFilter
End Sub

试着这样做:

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData
.FilterMode
如果工作表处于筛选模式,则返回true。(有关详细信息。)
有关
.AutoFilter


最后,将提供有关
.ShowAllData
方法的更多信息。

如果当前未应用筛选器,ShowAllData将抛出错误。这将有助于:

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

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

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

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

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

只需激活过滤器标题并运行showalldata,即可100%工作。类似于:

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

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

对于表格,请尝试此项检查其是否打开和关闭:

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

Range("R1:Y1").Activate
ActiveSheet.ShowAllData
要重新打开:

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

我发现这个解决方法非常有效。它基本上从表中删除autofilter,然后重新应用它,从而删除以前的任何筛选器。根据我的经验,这不容易出现这里提到的其他方法所需的错误处理

wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
这也会起作用:

Set myTable = YOUR_SHEET.ListObjects("YourTableName")

myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True

Im使用
.filtermode
,如果启用筛选器,则返回true

If ActiveSheet.FilterMode Then cells.AutoFilter
这个很好用

Dim returnValue As Boolean
    returnValue = worksheet1.FilterMode

    if returnValue Then
    worksheet1.ShowAllData
    End If
我在一本书中找到了这个答案

它使用AutoFilterMode作为布尔值

If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
试试这个:

   If Worksheets("Sheet1").AutoFilterMode Then Selection.AutoFilter
此代码清除所有筛选器并删除排序


来源:

我通常使用此代码

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

下面是一些修复筛选器的代码。例如,如果在工作表中打开筛选器,则添加列,然后希望新列也被筛选器覆盖

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

这太棒了,这是我找到的唯一能满足我特殊需要的答案,非常感谢你把它放出来

我只是对它做了一个小的添加,这样屏幕就不会闪烁,它会在每个工作表循环时删除并随后重新应用密码[我对工作簿中的所有工作表都有相同的密码]。本着您提交的精神,我添加此内容是为了帮助其他人

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
我知道这是一篇比较老的帖子,我不太喜欢做一个亡灵巫师……但因为我也有同样的问题,并且在这篇帖子中尝试了一些选项,但没有成功,所以我结合了一些答案来获得一个工作宏

希望这有助于其他人:)


这是我用的一个班轮。它检查是否有自动过滤器,如果找到,则将其删除

与某些答案不同,如果在一开始没有自动筛选的工作表上使用此代码,则不会创建自动筛选

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

这条线索很古老,但我对给出的任何答案都不满意,最后我自己写了。我现在分享它:

我们从以下几点开始:

If Cells.AutoFilter Then Cells.AutoFilter
我们可以将一个特定的工作表馈送到此宏,该宏将仅取消筛选该工作表。如果您需要确保只有一个工作表是清晰的,那么这将非常有用。但是,我通常想要完成整个工作簿

  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

在使用ActiveSheet之前,必须先选择表的范围。ShowAllData在Excel中有两种类型的筛选器:

  • 自动过滤器
  • 高级过滤器
自动筛选功能允许您使用这些微小的下拉按钮从excel界面进行筛选。高级过滤器功能允许您使用标准范围进行过滤

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

下面是我经常用来移除过滤器的一个子集:

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

您所需要的只是:

Sub RemoveFilters(ByRef WhichSheet As Worksheet)

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

End Sub

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

只有当您有筛选器时才会清除该错误,并且在没有任何筛选器时不会导致任何错误。
如果是ActiveSheet.AutoFilterMode,那么是ActiveSheet.Columns(“A”).AutoFilter

这最适合我

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

    ActiveSheet.AutoFilter.ShowAllData

我将这种方法作为一种独特的方法用于多表和范围表

Sub remove_filters

ActiveSheet.AutofilterMode = False

End Sub

哇。之后登录将删除第一行的所有内容,但不包括第一行的一部分。我的错误。然而,这将是简洁的

对于这两个测试 在活页1的A1和A5中输入文本 仅过滤空白。 运行任一测试 在A5中输入文本 尝试过滤

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

因此,当清除筛选器以清除工作表时,将使用.Cells.AutoFilter。

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

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

@此解决方案将自动删除
Auto
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
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"