У меня есть таблица, содержащая несколько дат. Они обычно появляются либо в mm/dd/yyyy
, либо mm/dd/yyyy hh:mm
.
Проблема заключается в том, что даты не всегда корректно, и я хочу иметь проверки, чтобы убедиться, что они являются датами в коде.
Моя первоначальная мысль заключалась в том, чтобы использовать IsDate
для проверки или CDate
, но это, похоже, не работало: оно все равно возвращало строки вместо дат.
С тех пор я создал небольшой эксперимент, который показывает, что эти функции не работают так, как я их ожидаю. Методология:
- В ячейке A1 введите формулу
=DATE(2013,10,28)
- Формула ячейки B1
=A1*1
, которая должна быть равна числу (41575) -
Запустите этот маленький script
Sub test() MsgBox ("Start:" & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value)) ActiveCell.Value = Format(ActiveCell.Value, "mm/dd/yyyy") MsgBox ("After format: " & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value)) ActiveCell.Value = CDate(ActiveCell.Value) MsgBox ("After Cdate: " & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value)) End Sub
Когда начинается script, ячейка имеет дату типа и IsDate
возвращает true. После того, как он выполняется через Format
, он имеет строку типа, но IsDate
все еще возвращает true. CDate
также преобразует ячейку в строку. Ячейка B1 также вернет 0 (так как ее строка * 1).
Итак, я собираюсь суммировать вопросы:
- Почему
Format
иCDate
меняют мои ячейки на строки? - Как я могу гарантировать, что ячейка вернет значение даты, а не только строку, которая выглядит как дата?