Excel VBA保存带日期的自动筛选设置

Excel VBA保存带日期的自动筛选设置,vba,excel,autofilter,Vba,Excel,Autofilter,我有一个宏的一部分,它在清除过滤器之前存储自动过滤器设置,以便以后可以重新应用它们。代码如下: 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) = .

我有一个宏的一部分,它在清除过滤器之前存储自动过滤器设置,以便以后可以重新应用它们。代码如下:

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会导致错误(应用程序定义的错误或对象定义的错误),而运算符返回值7。这种情况发生在Excel 2007中,在Excel 2013中仍在发生

我认为这不起作用的原因是由于自动过滤器处理日期字段的嵌套方式,但是有没有一种方法可以使它与日期一起工作?我已经看到了将过滤器应用于日期的其他问题,但首先存储它们肯定会更容易


还有第二个问题——7的值对运算符意味着什么?我只能找到值0-2的翻译。

我已经修改了您的代码,它现在运行良好,并且在我的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), ".")
(与标准2类似)

关于第二个问题:请参阅本文中的代码示例:

注意,下面的解决方案适用于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?我在2013年,但2007年也有同样的问题
ActiveWindow.AutoFilterDateGrouping = False