【问题标题】:Autofilter hides all rows when I set a date-based filter from Excel VBA当我从 Excel VBA 设置基于日期的过滤器时,自动过滤器会隐藏所有行
【发布时间】:2020-11-12 14:03:07
【问题描述】:

这是我的任务的简化模型:

我想过滤此表以仅显示 7 月 22 日之后的条目。如果我手动应用过滤器并在菜单/对话框中使用以下值,我可以获得预期的结果:

  • “日期过滤器”
  • “之后……”
  • “之后”和“22/7/2020”

但是当我使用这段代码时(从关闭自动过滤器开始)...

Dim xx As Date
xx = Cells(4, 1)
ActiveSheet.Range("$A:$B").AutoFilter Field:=1, Criteria1:=">" & xx, Operator:=xlAnd

... excel 过滤掉所有行。

尝试调试时,如果我单击 A 列中的自动筛选下拉按钮,看起来 Excel 填充的选项与我手动完成的完全相同...如果我单击对话框并单击确定(没有改变任何东西),过滤器的行为符合预期。

有什么方法可以让 VBA 正确应用自动过滤器?

在实际应用中,我只需要简单的功能(在截止日期之前/之后应用不同的颜色)。在最坏的情况下,我可以在工作表中添加一个临时布尔列并对其进行过滤......但如果有人能提出一种不那么笨拙的方法,我将不胜感激。

ActiveSheet.Range("$A:$c").AutoFilter Field:=3, Criteria1:="True", Operator:=xlAnd

如果相关,我在英国,地区默认日期格式 = DD/MM/YY。

【问题讨论】:

  • 在手动应用过滤器时录制宏,并将其与现有代码进行比较。
  • 感谢蒂姆的快速回复。记录 + 然后运行宏给出相同的结果:所有行都被隐藏。然后(在运行 VBA 之后)我转到电子表格并单击 A1 中的 Autofilter 下拉按钮,然后将鼠标悬停在“日期过滤器”上(注意它旁边已经有一个勾号),然后出现一个子菜单带有一个勾号已经在“之后”旁边。我单击那里,然后单击确定以确认已经存在的内容('is after' 和 '22/07/2020')......所以我什么也没做任何更改,并且过滤器有效。
  • 当然有你想要的结果——问题是记录的代码与你发布的代码相比如何?
  • 嗨蒂姆,对不起,我过度解释了您的问题,感谢您的跟进。这是记录的代码:Sub Macro3()Columns("A:B").SelectSelection.AutoFilterActiveSheet.Range("$A$1:$B$6").AutoFilter Field:=1, Criteria1:= ">22/07/2020", Operator:=xlAndEnd Sub 因为它给出的结果与我最初发布的代码相同,所以我认为发布代码没有用(足以说明行为是一样的)。但是,通过提示我再次使用代码,您的问题帮助我找到了自己的解决方案,我将在下面发布!

标签: excel vba date autofilter


【解决方案1】:

我是 OP,多亏了 Tim 的提示,我找到了解决方案!

为了绝对清楚,这里有一个模型更接近地复制了我的实际任务,以我需要使用的格式显示日期(我使用这种格式是因为电子表格在欧洲和美国之间共享,也因为我相信VBA 可能比 DD/MM/YY 或 MM/DD/YY 更强大......对于这个问题,我认为重要的是要表明 Excel 不能因为常见的 MMDD 与 DDMM 问题而误解日期)。

如果我将 VBA 记录器设置为运行,然后手动设置日期 > 2020-Jul-22 的自动筛选(从自动筛选日历工具中选择日期),结果如下所示:

如果我然后关闭自动过滤器并重新运行我记录的步骤,我会得到:

我的“已清理”代码也得到了相同的结果,如上面的原始帖子所示。

为了让代码给出预期的结果,只需将 xx 的类型从 Date 更改为 Long

更新后的代码——给出正确的结果——是这样的:

  Dim xx As Long
  xx = Cells(3, 1)
  ActiveSheet.Range("$A:$B").AutoFilter Field:=1, Criteria1:=">" & xx, Operator:=xlAnd
  Debug.Print xx
End Sub

即时窗口将 xx 的值显示为“44033”。

我尝试了其他一些实验,并且我发现(至少在我的区域设置中)如果 (A) 我尝试使用 Date 类型的变量设置自动过滤器并且 (B) 日期在任何一个月的 12 日,Excel 都会显示过滤器,就好像我输入了无效的日期一样。通用解决方案(使用 VBA 填充日期过滤器)是将日期转换为数字数据类型,例如 LongSingle 而不是 Date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2021-07-01
    • 2011-06-23
    • 2021-11-24
    • 2017-01-05
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多