Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何修复日期过滤器VBA,因为它不会拾取我的范围内的所有日期_Excel_Vba_Filter_Excel Formula_Date Range - Fatal编程技术网

Excel 如何修复日期过滤器VBA,因为它不会拾取我的范围内的所有日期

Excel 如何修复日期过滤器VBA,因为它不会拾取我的范围内的所有日期,excel,vba,filter,excel-formula,date-range,Excel,Vba,Filter,Excel Formula,Date Range,我正在尝试创建一个过滤器,它将过滤掉我选择的日期范围内的所有日期。我选择的日期将始终反映整个月 例如,如果我需要2019年5月的数据,我将输入我的开始日期为2019年5月1日,结束日期为2019年5月31日 我的数据过滤器将需要拾取通过我的开始日期的所有行。因此,它应该选择整个日历年2019年1月1日至2019年12月31日、2019年4月1日至2019年6月30日以及任何涵盖5月份的日期 目前,我的过滤器仅拾取整个日历年和一些但不包括所有日期,如2019年5月1日至2019年5月31日。因此,

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

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

我的数据过滤器将需要拾取通过我的开始日期的所有行。因此,它应该选择整个日历年2019年1月1日至2019年12月31日、2019年4月1日至2019年6月30日以及任何涵盖5月份的日期

目前,我的过滤器仅拾取整个日历年和一些但不包括所有日期,如2019年5月1日至2019年5月31日。因此,我遗漏了很多信息,比如作为季度的日期,或者五月前后几个月的日期

我试图通过移动“小于”和“大于”标志来改变它的过滤方式,但这只是意味着许多交易被排除在外

我在另一个数据少得多的工作簿上使用此筛选器,它会拾取所有数据。然而,在这本工作簿上,有更多的数据,而且开始日期变化很大,所以我丢失了大约一半我需要的数据

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
此外,我们还将lngStart和lngEnd转换为双数据类型,这就是日期在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日期。换句话说,它们是日期的文本表示形式,其格式不同于您的区域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

然而,这远非理想,因为很可能,即使是呈现为真正Excel日期的日期也可能被错误地翻译。换句话说,如果CSV文件包含2019年1月5日,即2019年1月5日,则在引用的场景中,它将被转换为2019年5月1日。

您所有的日期都是整数吗?因为,5月31日午夜1分钟不是以文本形式显示一些可以复制/粘贴的数据,这说明了问题所在。在作为文本发布时,考虑使用这个,或者可能上传一个工作簿,它演示了敏感信息被删除到某个公共网站的问题,并在原来的问题中发布链接。@ TrasoCIDI我尝试过,但是它得到了相同的结果。如果我点击“开始日期”和“结束日期”标题上的过滤器时它有任何用处,它将按日历年按n个时间顺序开始。所以2018年有一个按月扩展的选项,2019年、2020年、2021年等都是一样的。然后是个别日期,例如2019年1月1日、2018年1月1日等。我们注意到了,但为什么每次都要更改自动过滤器适用的范围?你为什么要把标准提高一倍?ActiveSheet.UsedRange.Autofilter字段:=7,标准1:=&lngStart@Chronocidal我使用的数据已经设置好,开始日期和结束日期在两个单独的列中。我必须加倍标准来过滤每一列。除此之外,它排除了大量信息。首先,感谢您仔细查看并解释了整个过程。我试过把这个应用到我的工作簿上。该VBA仅拾取与5月份日期完全匹配的数据。它漏掉了我需要的2019年5月的所有日期。@user11497252这是由于另一个问题。它实际上返回的是5月份的所有日期。未显示的行是DMY格式的日期文本表示。但它们已经呈现为文本。无论您如何获取日期,您都必须纠正您的流程,以便正确翻译日期。也可能是源代码中的真实日期翻译错误。
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