【问题标题】:Excel VBA Saving autofilter settings with datesExcel VBA 使用日期保存自动筛选设置
【发布时间】:2013-12-18 04:49:05
【问题描述】:

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

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 的值对 Operator 意味着什么?我只能找到值 0-2 的翻译。

【问题讨论】:

  • 您使用的是什么版本的 Excel?
  • 我在 2013 年,但在 2007 年遇到同样的问题

标签: vba excel autofilter


【解决方案1】:

我已经修改了您的代码,它现在运行良好,并且在我的 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?

【讨论】:

    【解决方案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 数据。工作代码在这里:
    Get Date Autofilter in Excel VBA

    【讨论】:

      【解决方案3】:

      我发现,在数组中启用过滤日期。

      以下设置必须禁用(默认启用)

      ActiveWindow.AutoFilterDateGrouping = False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多