Использование строковых значений для критериев DATE для COUNTIF в vba excel
У меня есть 2 клетки в диапазоне B:B, которые я хочу применить countif
формула через VBA в Excel.
27/09/2017
13/06/2018
я пытался
MsgBox (WorksheetFunction.CountIf(Range("B:B"), "27/09/2017"))
Это возвращает 0
MsgBox (WorksheetFunction.CountIf(Range("B:B"), CDate("27/09/2017")))
Это возвращает 1
Я пытаюсь выяснить, как я могу получить макрос, чтобы вернуть оба значения даты, через
MsgBox (WorksheetFunction.CountIf(Range("B:B"), "<=" & CDate("13/06/2018")))
Однако это возвращает 0
Кажется, это указывает на то, что я не совсем понимаю, как фильтровать даты в countif через строки. Можно ли поделиться альтернативой?
Я надеюсь реализовать текстовое поле ввода, где пользователь может ввести строку даты, которая затем применяет countif
на
1 ответ
Вам необходимо сначала преобразовать дату в двойное, чтобы сравнить фактическое значение даты независимо от формата.
"<=" & 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 фактически сохраняет серийное значение, но показывает форматированную строку для совместимости с пользователем.
Заключение
Если вы хотите сравнить даты, всегда сравнивайте их значения, а не строки.
Также см.: Как использовать даты и время в Excel.