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
应该捕获高级过滤器
Ste*_*tin 20
避免这种情况的简单方法是不使用工作表方法ShowAllData
Autofilter具有相同的ShowAllData方法,该方法在启用过滤器但未设置过滤器时不会引发错误
If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData
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
.
我刚刚遇到了同样的问题。经过一些反复试验,我发现如果选择位于过滤器区域的右侧并且显示的记录数为零,则 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 上