如何修复日期过滤器 VBA,因为它没有选择我范围内的所有日期

How to fix date filter VBA as it is not picking up all dates that fall within my range

我正在尝试创建一个过滤器来过滤掉所有在我选择的日期范围内的日期。我选择的日期将始终反映整月。

例如,如果我需要 2019 年 5 月的数据,我将输入开始日期为 01/05/2019,结束日期为 31/05/2019。

我的数据过滤器将需要选取所有经过我的开始日期的行。因此它应该选择整个日历年 (01/01/2019 - 31/12/2019)、季度 (01/04/2019 - 30/06/2019) 以及涵盖五月份的任何日期。

目前我的过滤器只选择整个日历年和一些(但不是全部)确切日期,例如 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 月(示例月份)之前的所有数据。它只显示一个月的交易之一,如果还有五个,则显示一个季度的交易。

日期在 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

此外,我们将 lngStartlngEnd 转换为 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
  • 结束列小于结束日期(您输入的日期是实际所需结束日期之后的一个日期,这是正确的。

编辑:

另一个问题是您的某些日期不是 "real Excel dates"。换句话说,它们是日期的文本表示,其格式不同于您的区域 windows 设置,其中月份条目 > 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

然而,这远非理想,因为很可能即使呈现为 "real Excel dates" 的日期也可能被错误翻译。换句话说,如果 CSV 文件包含 05/01/2019,意思是 5-Jan-2019,它将在引用的场景中转换为 1-May-2019