我有一个宏的一部分,它在清除过滤器之前存储自动过滤器设置,因此它可以在以后重新应用它们。代码如下:
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的翻译。
答案 0 :(得分:0)
我修改了你的代码,它现在也运行得很好,我的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), ".")
(类似于.Criteria2)
关于您的第二个问题:请参阅此帖子中的代码示例: In Excel VBA, how do I save / restore a user-defined filter?
答案 1 :(得分:0)
注意,以下解决方案适用于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数据。这里的工作代码:
Get Date Autofilter in Excel VBA
答案 2 :(得分:0)
我发现,要在数组中启用过滤日期。
必须禁用以下设置(默认启用)
ActiveWindow.AutoFilterDateGrouping = False