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 |
如果工作表处于过滤器模式,则
有关
最后,这将提供有关
这对我来说最有效。
在保存和关闭文件之前,我通常使用以下命令。
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中。
我在过滤器上使用
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 |
使用