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

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 .