如何修复日期过滤器VBA,因为它无法获取我范围内的所有日期

时间:2019-05-14 09:46:02

标签: excel vba filter excel-formula date-range

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

例如,如果我需要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月(例如月份)的所有数据。它仅显示一个月的交易,而另外五个显示四分之一的交易。

1 个答案:

答案 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

此外,我们将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
  • 结束列小于结束日期(您输入的日期比实际期望的结束日期晚一个日期,这是适当的。

编辑:

另一个问题是您的某些日期不是“真实的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