Я предлагаю безопасное решение, которое возвращает результат, только если преобразование прошло успешно:
s="2008-10-20 10:00:00.0000000"
On Error Resume Next
d=CDate(Left(s,19))
On Error Goto 0
if not IsEmpty(d) then MsgBox d
Попробуйте ввести недопустимую дату или недопустимый формат.Результат будет пустым.
s="2008-02-31 10:00:00"
В тех же контекстах необходимо инициализировать результат сбора переменных CData.Я рекомендую инициализировать его как пустой.Пример ниже показывает такой случай - подсчет действительных дат в строковом массиве:
Lines = array("2008-10-20 10:00:00.0000000", "2008-10-20 10:00:00", "", "2008-02-31", "Today", "2017-02-7")
On Error Resume Next
Count=0
for each Line in Lines
d=Empty
d=CDate(Line)
if not IsEmpty(d) then Count=Count+1
next
On Error Goto 0
MsgBox "Number of valid dates is "&Count
Правильный ответ - 2. Без инициализации мы получаем 5, поскольку CDate ничего не делает в случае ошибки, поэтому переменная сохраняет значение изнедавняя итерация в цикле.