использование строковых значений для критериев даты для 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". Таким образом, вы сравниваете значение, а не текст. Это работает, потому что если ячейка отформатирована какdateExcel фактически сохраняет последовательное значение, но показывает отформатированную строку для совместимости с пользователем.Заключение
Если вы хотите сравнить даты, всегда сравнивайте их значения, а не их строки.Также смотрите: Как использовать даты и времена в Excel .