在 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"))
这是为什么?
如果您将 string
与 date
连接起来,例如 "<=" & 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 实际上存储序列值但显示格式化的字符串以实现用户兼容性。
结论
如果你想比较日期,总是比较它们的值而不是它们的字符串。
我在 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"))
这是为什么?
如果您将 string
与 date
连接起来,例如 "<=" & 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 实际上存储序列值但显示格式化的字符串以实现用户兼容性。
结论
如果你想比较日期,总是比较它们的值而不是它们的字符串。