Excel 2013 VBA 清除当前筛选

7

在运行特定的宏之前,我需要清除工作表中的任何活动筛选器,如果有活动筛选器,则此行代码可以正常工作。

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData

然而,如果未选择筛选器,则会返回错误。
Runtime error '1004';
ShowAllData method of Worksheet class failed

我从这个问题的答案中得到了这段代码Excel 2013 VBA 清除所有过滤器宏

然而,该问题并没有解释如何忽略未激活任何过滤器的行。

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

编辑

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


那么设置了什么样的过滤器呢?你说如果没有活动的过滤器,就需要清除任何活动的过滤器。这对我来说似乎是个悖论。 - Alex
如果有活动筛选器,我需要清除所有活动筛选器,并忽略那个VBA行。所有列标题都已自动过滤,因此如果我的工作表被“女性”之类的过滤器过滤,例如,我需要在运行宏之前删除该过滤器,但是如果没有应用任何过滤器,只需正常运行宏即可。 - Tim Wilkinson
3个回答

15

使用FilterMode而不是AutoFilterMode。我经常处理筛选器,这段代码可以正常运行。

If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

确保工作表未被保护,因为这也会导致1004错误。


8

我真诚地钦佩你想要为特定情况编写程序的愿望,但我不得不承认,最快实现这一点的方法是使用On Error Resume Next

On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0

在VBA中,为了检查某个对象是否存在,有时候不得不通过破坏它来实现。个人认为,On Error Resume Next这种编程方式和SendKeys一样好用。

以上方法不需要检查.AutoFilterMode是否为True


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清除所有过滤器宏


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接