我有一个宏的一部分,它在清除过滤器之前存储自动过滤器设置,以便以后可以重新应用它们。代码如下:
Dim FilterArray()
With FrontPage.AutoFilter.Filters
ReDim FilterArray(1 To .Count, 1 To 3)
For f = 1 To .Count
With .Item(f)
If .On Then
FilterArray(f, 1) = .Criteria1
If .Operator Then
FilterArray(f, 2) = .Operator
If .Operator = xlAnd Or .Operator = xlOr Then
FilterArray(f, 3) = .Criteria2
End If
End If
End If
End With
Next f
End With
这在我遇到的所有情况下都很好,除了日期字段。在日期字段的情况下,Criteria1和Criteria2会导致错误(应用程序定义或对象定义的错误),而Operator会返回值7。这种情况发生在Excel 2007中,并且在Excel 2013中仍在发生。
我认为这不起作用的原因是由于自动过滤器处理日期字段的嵌套方式,但有没有方法可以在日期上起作用?我看到了其他与对日期应用过滤器有关的问题,但首先存储它们肯定会更容易吗?
还有第二个问题——7的值对操作员意味着什么?我只能找到值0-2的翻译。
我发现,要在数组中启用日期过滤器。
以下设置必须禁用(默认启用)
ActiveWindow.AutoFilterDateGrouping = False
我已经修改了你的代码,它现在运行得很好,在我的Excel 2013:中也有日期
' .Criteria1/2 are read as strings with local decimal separator
' but for re-setting Criteria1/2 should be in American format ...
' so replace local decimal separator by dot - this seems to apply also for dates,
' because dates are also transformed internally to decimal numbers
FilterArray(f, 1) = Replace(.Criteria1, Application.International(xlDecimalSeparator), ".")
(类似于.CCriteria2)
关于您的第二个问题:请参阅本文中的代码示例:在Excel VBA中,如何保存/恢复用户定义的筛选器?
注意,下面的解决方案适用于Excel 2010,我找不到Excel 2013的信息,但可能存在相同的问题
如果您在运行自动日期过滤器时记录宏,您会注意到这些值存储在Criteria2参数中,并且Criteria1未使用:
Range.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(2, "8/10/2015", 2, "8/20/2015")
尝试从VBA访问Criteria2参数会导致"应用程序定义或对象定义错误"
在撰写此答案时,我所知道的保存此自动筛选信息的唯一方法是读取xlsx文件中的XML数据。此处的工作代码:
在Excel VBA 中获取日期自动筛选