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)
中那样将 String
与 Date
连接起来,它将隐式地将您的数字日期转换为字符串以连接它。根据您在操作系统中设置的默认日期格式(我的是 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/yyyy
或 mm/dd/yyyy
。如果您让 Excel 转换它,那么它有 50/50 的机会弄错或弄对!
如果是这种情况,您需要将看起来像日期的字符串拆分为日、月和年,然后使用 DateSerial(Year, Month, Day)
将其转换为实际数字日期。通过这种方式,您可以定义字符串的 dd/mm/yyyy
或 mm/dd/yyyy
格式,并且不会让 Excel 猜测(并且可能会猜错)。
如果您的月份名称是英文,但您可能还需要这样做 01-May-2021
但您在另一个本地化系统中工作(就像我在德语中所做的那样)。因为德语 Excel 不知道如何将 May
转换为月份,因为在德语中它是 Mai
。所以 Excel 不能自动转换,你也需要用你自己的函数拆分和转换它(否则它只能在英语 Excels 中工作)。
我正在尝试使用 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)
中那样将 String
与 Date
连接起来,它将隐式地将您的数字日期转换为字符串以连接它。根据您在操作系统中设置的默认日期格式(我的是 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/yyyy
或 mm/dd/yyyy
。如果您让 Excel 转换它,那么它有 50/50 的机会弄错或弄对!
如果是这种情况,您需要将看起来像日期的字符串拆分为日、月和年,然后使用 DateSerial(Year, Month, Day)
将其转换为实际数字日期。通过这种方式,您可以定义字符串的 dd/mm/yyyy
或 mm/dd/yyyy
格式,并且不会让 Excel 猜测(并且可能会猜错)。
如果您的月份名称是英文,但您可能还需要这样做 01-May-2021
但您在另一个本地化系统中工作(就像我在德语中所做的那样)。因为德语 Excel 不知道如何将 May
转换为月份,因为在德语中它是 Mai
。所以 Excel 不能自动转换,你也需要用你自己的函数拆分和转换它(否则它只能在英语 Excels 中工作)。