XL VBA Autofilter筛选日期小技巧

XL VBA Autofilter筛选日期小技巧

问题描述

在工作的时候经常碰到这样的问题,因为系统日期格式不是 美式标准 ,所以用VBA做日期筛选的时候,VBA会试着把月和日的数字交换,例如把1/2/2017(2017年1月2日)理解成2/1/2017(2017年2月1日),不过13/1/2017不会受到影响,因为13不是有效的月份。

注意事项

澳大利亚的标准日期格式为: 日/月/年 ,这是我们想要使用的格式

美国的标准日期格式为: 月/日/年 ,VBA强行使用的格式

举个栗子

下面举个小栗子。我们想要用VBA筛选下图中2017年1月1日到2017年1月10日的数据。

24行数据

一开始的代码为(知乎好像不支持VBA高亮?)

Option Explicit
Sub demo()
    Dim table As ListObject
    Dim startDate As Date
    Dim endDate As Date
    startDate = DateSerial(2017, 1, 1)
    endDate = DateSerial(2017, 1, 10)
    Set table = ActiveSheet.ListObjects("demoTable")
    table.Range.AutoFilter field:=1, Criteria1:=">=" & startDate, _
    Criteria2:="<=" & endDate
End Sub

得到的结果如下图

虽然不清楚,不过还是24行数据

仔细看一下对应的筛选条件,可以发现VBA把1和10交换了(日期顺序为 日/月/年 )。所以实际应用的筛选条件为筛选所有2017年1月1日到2017年10月1日的数据。

解决方案

解决方法其实非常简单,因为日期在Excel中只是一串整数,所以我们可以直接用Long type来表示日期,这样VBA就不会误解了。具体代码为

Option Explicit
Sub demo()
    Dim table As ListObject
    Dim startDate As Date
    Dim endDate As Date
    Dim lStartDate As Long
    Dim lEndDate As Long
    startDate = DateSerial(2017, 1, 1)
    endDate = DateSerial(2017, 1, 10)
    lStartDate = startDate
    lEndDate = endDate