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