38

I notice my VBA script doesn't work when there's an autofilter already on. Any idea why this is?

    wbk.Activate
    Set Criteria = Sheets("Sheet1").Cells(i, 1)

    Set rng = Sheets("Sheet1").Range(Cells(i, 2), Cells(i, 4))

    wb.Activate
    If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData 'remove autofilter, but it crashes on this line

    Selection.AutoFilter

    Range("$A$1:$BM$204").AutoFilter Field:=2, Criteria1:=Criteria.Value

    rng.Copy

    Range("$BC$2:$BE$204").SpecialCells(xlCellTypeVisible).PasteSpecial

Many thanks

4

7 回答 7

55

如果启用 AutoFilterMode 将为 True,无论是否实际应用了特定列的过滤器。发生这种情况时,ActiveSheet.ShowAllData仍会运行,抛出错误(因为没有实际过滤)。

我有同样的问题,并得到它的工作

If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
  ActiveSheet.ShowAllData
End If

这似乎可以防止 ShowAllData 在没有应用实际过滤器但打开 AutoFilterMode 时运行。

第二个捕获Or ActiveSheet.FilterMode应该捕获高级过滤器

于 2013-12-14T09:58:48.180 回答
35

避免这种情况的简单方法是不使用工作表方法 ShowAllData

Autofilter 具有相同的 ShowAllData 方法,当启用过滤器但未设置过滤器时不会引发错误

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

于 2015-07-19T07:29:26.330 回答
12

ShowAllData method of Worksheet class failed当您尝试删除未应用的过滤器时,通常会发生该错误。

我不确定您是要删除整个AutoFilter,还是仅删除任何已应用的过滤器,但是每种方法都有不同的方法。

要删除已应用的过滤器但保留AutoFilter

If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

上述代码背后的基本原理是测试AutoFilter是否已应用过滤器或是否已应用过滤器(这也将删除高级过滤器)。

要完全删除AutoFilter

ActiveSheet.AutoFilterMode = False

在上述情况下,您只是完全禁用了AutoFilter

于 2013-08-14T08:02:05.740 回答
5

我刚刚遇到了同样的问题。经过反复试验,我发现如果选择在我的过滤器区域的右侧并且显示的记录数为零,则 ShowAllData 将失败

更多的上下文可能是相关的。我有很多张,每张都有一个过滤器。我想在所有工作表上设置一些标准过滤器,因此我使用一些像这样的 VBA

Sheets("Server").Select
col = Range("1:1").Find("In Selected SLA").Column
ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=col, Criteria1:="TRUE"

此代码将调整标题为“In Selected SLA”的列上的过滤器,并保持所有其他过滤器不变。这有一个不幸的副作用,我可以创建一个显示零记录的过滤器。仅使用 UI 是不可能的。

为避免这种情况,我想在应用上述过滤之前重置所有过滤器。我的重置代码看起来像这样

Sheets("Server").Select
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

请注意我没有移动选定的单元格。如果选择在右边,它不会删除过滤器,从而让过滤器代码构建一个零行过滤器。第二次运行代码(在零行过滤器上)ShowAllData 将失败。

解决方法很简单:在调用 ShowAllData 之前移动筛选列内的选择

Application.Goto (Sheets("Server").Range("A1"))
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

这是在 Excel 版本 14.0.7128.5000(32 位)= Office 2010 上

于 2014-10-25T10:28:40.333 回答
3

这将起作用。定义它,然后在需要时调用它。(如果您要制作一个清晰的按钮,则适用于按钮逻辑):

Sub ResetFilters()
    On Error Resume Next
    ActiveSheet.ShowAllData
End Sub
于 2019-08-22T17:51:23.397 回答
1

我也是同样的问题。我认为原因是,

1)当我的activecell在表格中时,“ActiveSheet.ShowAllData”可以工作。2)当我的activecell不在表格中时,“ActiveSheet.ShowAllData”无法工作。使用此代码,ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=1 可以清除过滤器。

于 2018-09-15T11:55:03.560 回答
0

在下面添加此代码。一旦关闭它,释放过滤器。第二次在没有过滤器的情况下重新打开它。

不是很优雅,但符合我的目的。

ActiveSheet.ListObjects("MyTable").Range.AutoFilter

'then call it again?
ActiveSheet.ListObjects("MyTable").Range.AutoFilter
于 2020-08-18T23:40:56.223 回答