Worksheet类的ShowAllData方法失败

时间:2013-08-14 07:52:18

标签: excel vba autofilter

我注意到当自动过滤器已经打开时,我的VBA脚本不起作用。知道为什么会这样吗?

    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

非常感谢

7 个答案:

答案 0 :(得分:38)

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

我遇到了同样的问题并且正在使用

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

当没有应用实际过滤器但启用了AutoFilterMode时,这似乎会阻止ShowAllData运行。

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

答案 1 :(得分:18)

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

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

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

答案 2 :(得分:10)

当您尝试在未应用过滤器时删除已应用的过滤器时,通常会发生错误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

答案 3 :(得分:3)

我刚遇到同样的问题。经过一些反复试验后,我发现如果选择位于我的过滤区域右侧并且显示的记录数为零,则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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

不是很优雅,但是达到了我的目的。

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

'then call it again?
ActiveSheet.ListObjects("MyTable").Range.AutoFilter