在 vba excel 中使用字符串值作为 COUNTIF 的 DATE 标准

using string values for DATE criterias for COUNTIF in vba excel

我在 B:B 范围内有 2 个单元格,我希望通过 VBA 在 Excel 中应用 countif 公式。

27/09/2017
13/06/2018

我试过了

MsgBox (WorksheetFunction.CountIf(Range("B:B"), "27/09/2017"))

这个returns 0

MsgBox (WorksheetFunction.CountIf(Range("B:B"), CDate("27/09/2017")))

这个returns 1

我想弄清楚如何通过

将宏设为 return 两个日期值
MsgBox (WorksheetFunction.CountIf(Range("B:B"), "<=" & CDate("13/06/2018"))) 

然而这个returns 0

这似乎表明我不太了解如何通过字符串过滤countif中的日期。是否可以共享替代方案?

我希望实现一个文本输入框,用户可以在其中输入日期字符串,然后在

上应用 countif

您需要先将日期转换为double,以便比较独立于格式的日期的实际值。

 "<=" & CDbl(CDate("13/06/2018"))

这是为什么?
如果您将 stringdate 连接起来,例如 "<=" & CDate("13/06/2018"),则 date 将转换为 string,结果为 "<=13/06/2018"(此处日期是一个字符串而不是一个值)。

如果将 date 转换为 double CDbl(CDate("13/06/2018"),结果是 43264,这是表示日期的序列号。 Excel 中的日期存储为从 1900-01-01 开始计算的序列号,因此 2018-06-13 是第 43264 天,因为 1900-01-01

因此,对于 "<=" & CDbl(CDate("13/06/2018")),您实际上将单元格值与 "<=43264" 进行了比较。所以你比较的是一个值而不是一个文本。这是有效的,因为如果一个单元格被格式化为 date Excel 实际上存储序列值但显示格式化的字符串以实现用户兼容性。

结论
如果你想比较日期,总是比较它们的值而不是它们的字符串。

另见:How to use dates and times in Excel.