Ошибка несоответствия типов CDate
Я пытаюсь преобразовать текстовое поле в дату, используя CDate() в наборе записей, но постоянно получаю ошибку несоответствия типов. Формат ввода текста: ММДДГГГГ. CDate не распознает этот формат? Нужна ли мне отдельная функция? Есть идеи?
Text Date -> Converted Date
--------- --------------
04122012 -> 04/12/2012
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_dates", Type:=dbOpenDynaset)
Do Until rst.EOF
rst.Edit
rst![Converted Date]=CDate(rst![Text Date])
rst.Update
rst.MoveNext
Loop
Set rst = Nothing
Set db = Nothing
2 ответа
CDate()
не примет вашу строку даты без какого-либо разделителя между частями месяца, дня и года. Эта попытка не удалась с ошибкой несоответствия типов.
? CDate("04122012")
Если это полезно, вы можете использовать IsDate()
функция, чтобы проверить, находятся ли ваши строки даты в формате CDate()
приму.
? IsDate("04122012")
False
? IsDate("04-12-2012")
True
? IsDate("04/12/2012")
True
? CDate("04-12-2012")
4/12/2012
bar = "04122012" : Debug.Print CDate(Left(bar,2) & "-" & _
Mid(bar,3,2) & "-" & Right(bar,4))
4/12/2012
Редактировать: если есть несоответствие между настройкой локали вашей системы и форматом ваших строк даты, вы можете преобразовать эти строки даты в формат гггг-мм-дд, чтобы избежать проблем с CDate()
,
bar = "04122012" : Debug.Print CDate(Right(bar,4) & "-" & _
Left(bar,2) & "-" & Mid(bar,3,2))
4/12/2012
Помощь для CDate
говорит:
CDate распознает форматы даты в соответствии с настройками локали вашей системы. Правильный порядок дня, месяца и года не может быть определен, если он предоставлен в формате, отличном от одной из распознанных настроек даты.
Чтобы избежать путаницы из-за настроек локали, вы можете использовать DateSerial
вместо CDate
, как в выражении, как это (предполагая, Text Date
всегда имеет 8 символов в формате MMDDYYYY):
DateSerial(Right(rst![Text Date], 4), Left(rst![Text Date], 2), Mid(rst![Text Date], 3, 2))