我正在尝试创建一个过滤器,该过滤器将过滤掉我选择的日期内的所有日期。我选择的日期将始终反映一个月。
例如,如果我需要2019年5月的数据,我将输入开始日期为01/05/2019和结束日期为31/05/2019。
我的数据过滤器需要选择开始日期之前的所有行。因此,它应该选择整个日历年(01/01/2019-31/12/2019),季度(01/04/2019-30/06/2019)以及涵盖5月的任何日期。
当前,我的过滤器仅提取整个日历年和某些(但不是全部)确切的日期,例如01/05/2019-31/05/2019。因此,我错过了很多信息,例如,以季度为单位的日期或5月前后的数月之内。
我试图通过移动小于和大于符号来过滤它的方式,但这只是意味着很多交易被排除在外了。
我在另一个工作簿上使用此过滤器,而该工作簿中的数据要少得多,它可以拾取所有数据。而在此工作簿上,有更多的数据,开始日期相差很大,所以我丢失了大约一半的数据。
Sub Filter()
Dim lngStart As Long, lngEnd As Long
lngStart = Range("AI1").Value 'this is the start date
lngEnd = Range("AI2").Value 'this is the end date
Range("G2:G5000").AutoFilter field:=7, _ 'this is the start date column
Criteria1:="<=" & lngEnd, _
Operator:=xlAnd, _
Criteria2:="<=" & lngEnd
Range("H2:H5000").AutoFilter field:=8, _ 'this is the end date column
Criteria1:=">=" & lngStart, _
Operator:=xlAnd, _
Criteria2:=">=" & lngStart
End Sub
当我单击过滤器时,我希望显示通过2019年5月(例如月份)的所有数据。它仅显示一个月的交易,而另外五个显示四分之一的交易。
答案 0 :(得分:0)
日期在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
和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
最后,我认为逻辑应该表明您希望日期在
编辑:
另一个问题是您的某些日期不是“真实的Excel日期”。换句话说,它们是日期的文本表示形式,其格式与您在“月”项中输入“> 12”的区域窗口设置不同。
当打开文本文件或csv文件而不是IMPORT文件时,通常会出现此问题,并且文件中的日期格式与计算机的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
的{{1}},则在引用的方案中将其转换为5-Jan-2019
。