Worksheet类的ShowAllData方法失败

Kri*_*rgh 31 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
Run Code Online (Sandbox Code Playgroud)

非常感谢

小智 41

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

我有同样的问题,并与之合作

If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
  ActiveSheet.ShowAllData
End If
Run Code Online (Sandbox Code Playgroud)

这似乎阻止ShowAllData在没有应用实际过滤器但启用了AutoFilterMode时运行.

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

  • 存在一个逻辑问题:**(A和B)或B == B**,因此您的解决方案相当于.....`如果ActiveSheet.FilterMode那么......` (18认同)

Ste*_*tin 20

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

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

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

  • OP引用的是Worksheet.ShowAllData,当打开过滤器但未选择任何条件时出现错误,而我的答案是使用Worksheet.Autofilter.ShowAllData,当未选择过滤器条件时不会导致错误。-ShowAllData是相同的方法, (2认同)

Mar*_*tin 11

ShowAllData method of Worksheet class failed当您没有应用过滤器时尝试删除已应用的过滤器时,通常会发生此错误.

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

要删除已应用的过滤器,请保留AutoFilter:

If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If
Run Code Online (Sandbox Code Playgroud)

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

要完全删除AutoFilter:

ActiveSheet.AutoFilterMode = False
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,你只是完全禁用了AutoFilter.


Pee*_*und 5

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

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

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

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

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

Sheets("Server").Select
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Run Code Online (Sandbox Code Playgroud)

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

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

Application.Goto (Sheets("Server").Range("A1"))
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Run Code Online (Sandbox Code Playgroud)

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