excel 范围内使用 vba 的日期过滤器不起作用

date filter on excel range using vba does not work

我正在尝试使用 vba 在 excel 中的日期范围之间进行过滤。 它不起作用。

但是,当我执行手动过滤器时,它起作用了。 所以我录制了宏并应用了相同的代码。 同样,它没有用。

文件中的日期格式如下:

假设我正在尝试过滤掉 2021 年 7 月 1 日至 31 日。

我的代码无效:A 列中的日期。

startDT = ActiveSheet.txtStartDT.Text   '01-Jul-2021
endDT = ActiveSheet.txtEndDT.Text    '31-Jul-2021

For Each srcWsht In srcWbk.Worksheets
            lastSrcRow = srcWsht.Range("A1").End(xlDown).Row
                        
            srcWsht.Range("A2:A" & lastSrcRow).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
            srcWsht.Range("A2:A" & lastSrcRow).NumberFormat = "dd-MM-yyyy"
            
            srcWsht.Range("A1:O" & lastSrcRow).AutoFilter Field:=1, Criteria1:=">=" & CDate(startDT), Operator:=xlAnd, Criteria2:="<=" & CDate(endDT), visibledropdown:=True
                 
            
            srcWsht.Range("A2:O" & lastSrcRow).SpecialCells(xlCellTypeVisible).Copy
            
            wshtData.Range("A" & lastDataRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            lastDataRow = wshtData.Range("A2").End(xlDown).Row + 1
            
Next srcWsht

您的过滤器需要一个数值来过滤。但是,如果您像在 ">=" & CDate(startDT) 中那样将 StringDate 连接起来,它将隐式地将您的数字日期转换为字符串以连接它。根据您在操作系统中设置的默认日期格式(我的是 yyyy-mm-dd),这将导致类似 ">=2021-07-01" 的结果不被视为日期,而是作为计算公式,它将减去 [= 2021 中的 16=] 和 01 并且您的过滤器执行 >=2013 这不是您想要的。

因此,通过将 Date 转换为 Double,例如 CDbl(CDate(startDT)),您将日期 2021-07-01 转换为 44378,这是日期的实际数值存储在您的单元格中的日期。现在您的过滤器可以 >=44378 并且可以正常工作

srcWsht.Range("A1:O" & lastSrcRow).AutoFilter Field:=1, Criteria1:=">=" & CDbl(CDate(startDT)), Operator:=xlAnd, Criteria2:="<=" & CDbl(CDate(endDT)), visibledropdown:=True

请注意,如果以 ' 开头,您的值为 Strings(看起来像日期的文本)。如果您现在删除 ' Excel 会将它们转换为数字日期(以便您可以计算和过滤它们)。但是 Excel 猜测格式。因此,如果它们是 dd-MMM-yyyy,Excel 非常清楚它是哪种格式,并且会正确猜测,但要小心 01/05/2022 之类的字符串,其中 Excel 不知道这是否是 dd/mm/yyyymm/dd/yyyy。如果您让 Excel 转换它,那么它有 50/50 的机会弄错或弄对!

如果是这种情况,您需要将看起来像日期的字符串拆分为日、月和年,然后使用 DateSerial(Year, Month, Day) 将其转换为实际数字日期。通过这种方式,您可以定义字符串的 dd/mm/yyyymm/dd/yyyy 格式,并且不会让 Excel 猜测(并且可能会猜错)。

如果您的月份名称是英文,但您可能还需要这样做 01-May-2021 但您在另一个本地化系统中工作(就像我在德语中所做的那样)。因为德语 Excel 不知道如何将 May 转换为月份,因为在德语中它是 Mai。所以 Excel 不能自动转换,你也需要用你自己的函数拆分和转换它(否则它只能在英语 Excels 中工作)。