我注意到当自动过滤器已经打开时,我的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
非常感谢
答案 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