Excel 2013 VBA清除活动过滤器

时间:2015-01-22 10:25:09

标签: excel vba excel-vba

我需要在运行某个宏之前清除工作表中的所有活动过滤器,如果有活动过滤器,此行可以正常工作

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData

但是,如果未选择过滤器,则返回错误

Runtime error '1004';
ShowAllData method of Worksheet class failed

我从这个问题的答案中得到了这个代码 Excel 2013 VBA Clear All Filters macro

但是,如果没有过滤器处于活动状态,则该问题无法解释如何忽略该行。

如果当前没有应用过滤器,我该如何忽略此行?

修改

例如,所有列标题都已自动过滤,因此如果我的工作表被“女性”过滤,例如我需要在运行宏之前删除该过滤器,但是如果没有应用过滤器,则只需运行宏正常

3 个答案:

答案 0 :(得分:13)

使用FilterMode而不是AutoFilterMode。我经常处理过滤器,这段代码工作正常。

If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

确保工作表不受保护,因为这也会产生1004错误。

答案 1 :(得分:8)

我真诚地钦佩您为特定情况制定计划的愿望,但我必须承认,实现这一目标的最快捷方式是使用On Error Resume Next

On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0

你不应该打破一些东西来检查它是否存在,但是在VBA中偶尔会有最好的追索权。就个人而言,我将On Error Resume Next排在SendKeys作为编程方法。

上述方法不要求您检查.AutoFilterMode是否 True

答案 2 :(得分:2)

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

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

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

**线程可能重复:Excel 2013 VBA Clear All Filters Macro