Использование строковых значений для критериев 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 в doubleCDbl(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.

Другие вопросы по тегам