【问题标题】:Column filter by VBA code按 VBA 代码过滤列
【发布时间】:2018-05-23 15:52:30
【问题描述】:

我想用 VBA 代码过滤日期列,但我得到了错误的结果。

我的数据(仅作为示例,我有很多行):

complete_date
(blank)
(blank)
(blank)
(blank)
(blank)
(blank)
5/12/18 9:08 AM
5/12/18 9:41 AM
5/20/18 1:51 PM
(blank)
(blank)
(blank)
(blank)
5/20/18 1:50 PM
5/20/18 1:52 PM
5/21/18 6:35 AM
5/20/18 1:49 PM
5/20/18 1:54 PM
5/21/18 7:53 AM
5/20/18 1:49 PM
5/20/18 1:56 PM
5/21/18 11:20 AM
5/20/18 1:49 PM

我的代码:

Public Sub MyFilter()
    Dim lngStart As Long, lngEnd As Long
    lngStart = Range("b1").Value 'assume this is the start date
    lngEnd = Range("b2").Value 'assume this is the end date
    Range("q:q").AutoFilter field:=1, _
        Criteria1:=">=" & lngStart, _
        Operator:=xlAnd, _
        Criteria2:="<=" & lngEnd
End Sub

对于这个例子,如果我根据以下日期过滤我没有得到所有可能的结果(我没有看到 5/20 天的任何结果)。 我的搜索:

5/20/18 13:51 ---> 开始时间 5/22/18 13:51 ---> 结束时间

知道为什么吗?谢谢,

【问题讨论】:

  • 自动过滤器中的日期必须采用美国格式。

标签: vba excel


【解决方案1】:

假设您的列 Q 和 2 个输入单元格被格式化为日期,则应该在日期而不是字符串之间进行比较

只需将代码更改为

Dim lngStart As date, lngEnd As date

【讨论】:

  • 我想你之前已经发布了这个问题,在我回答之前,你把它删除了。
  • 是的,昨天我虽然修复了它,所以我删除了它。无论如何,谢谢你的快速回响。
【解决方案2】:

您已将 lngStartlngEnd 定义为 Long,这是一个整数 - 因此您的参数的时间元素被忽略,并且日期时间 > 12:00 pm 被“四舍五入”到第二天。

将这些更改为输入Double,您的代码将按预期工作:

Public Sub MyFilter()
    Dim dStart As Double, dEnd As Double
    dStart = Range("b1").Value 'assume this is the start date
    dEnd = Range("b2").Value 'assume this is the end date
    Range("q:q").AutoFilter field:=1, _
        Criteria1:=">=" & dStart, _
        Operator:=xlAnd, _
        Criteria2:="<=" & dEnd
End Sub

【讨论】:

  • 当日期为英国 dd/mm/yyyy 格式时,代码 sn-p 不适用于声明为 Date 的变量,无需进一步处理日期格式以传递给过滤器。 Excel 将日期视为数字,因此使用 Double 数据类型可以安全地忽略本地日期格式。
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2019-04-08
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多