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日的数据。
一开始的代码为(知乎好像不支持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
得到的结果如下图
仔细看一下对应的筛选条件,可以发现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