VBA 过滤器中的日期很棘手。一方面,VBA 日期数据类型与格式化为日期的 Excel 值并不完全相同。
而且我觉得你的逻辑也有点不对劲。
这似乎适用于您的示例数据。
Sub Filter()
Dim lngStart As Long, lngEnd As Long, fltrRng As Range
lngStart = Range("J1").Value 'this is the start date
lngEnd = Range("J2").Value 'this is the end date
Set fltrRng = Range("A2:H5000")
With fltrRng
.AutoFilter field:=7, _
Criteria1:=">=" & CDbl(lngStart)
.AutoFilter field:=8, _
Criteria1:="<" & CDbl(lngEnd)
End With
End Sub
请注意,我们定义了整个过滤器范围,但我会以不同的方式动态定义它,以免包含不必要的行。
With Worksheets("sheet1")
Set fltrRng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 8).End(xlUp))
End With
此外,我们还转换了lngStart
and lngEnd
Double 数据类型,这是日期在 Excel 工作表上的存储方式。您可以将它们声明为 Double 类型。所以,尽管如此:
Sub Filter()
Dim lngStart As Double, lngEnd As Double, fltrRng As Range
lngStart = Range("J1").Value 'this is the start date
lngEnd = Range("J2").Value 'this is the end date
With Worksheets("sheet1")
Set fltrRng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 8).End(xlUp))
End With
With fltrRng
.AutoFilter field:=7, _
Criteria1:=">=" & lngStart
.AutoFilter field:=8, _
Criteria1:="<" & lngEnd
End With
End Sub
最后,我相信,逻辑应该说明你想要的日期
- 开始列等于或大于开始日期AND
- 结束列小于结束日期(您输入的日期是实际所需结束日期之后的一个日期,这是正确的。
EDIT:
另一个问题是您的某些日期不是“真正的 Excel 日期”。换句话说,它们是日期的文本表示形式,其格式与您的区域窗口设置不同,其中月份条目 > 12。
当打开文本或 csv 文件而不是导入文件,并且文件中的日期格式与计算机的 Windows 区域设置中的日期格式不同时,通常会出现此问题。
通过导入 csv 文件,可以指定传入数据的日期格式并避免此问题。
要在您提供的文件中演示它,请更改宏的过滤部分以也拾取文本日期。例如:
With fltrRng
.AutoFilter field:=7, _
Criteria1:=">=" & lngStart, _
Operator:=xlOr, _
Criteria2:=Format(lngStart, """*""/mm/yyyy")
.AutoFilter field:=8, _
Criteria1:="<" & lngEnd, _
Operator:=xlOr, _
Criteria2:=Format(lngEnd - 1, """*""/mm/yyyy")
End With
然而,这远非理想,因为很可能即使呈现为“真实 Excel 日期”的日期也可能被错误地翻译。换句话说,如果 CSV 文件包含05/01/2019
意义5-Jan-2019
,它会被翻译成1-May-2019
在引用的场景中。