Вопрос по vba – Ошибка несоответствия типов CDate

4

Я пытаюсь преобразовать текстовое поле в дату, используя 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   ответа
5

CDate говорит:

CDate recognizes date formats according to the locale setting of your system. The correct order of day, month, and year may not be determined if it is provided in a format other than one of the recognized date settings.

Чтобы избежать путаницы из-за настроек локали, вы можете использоватьDateSerial вместоCDate, как в выражении, как это (предполагая,Text Date всегда имеет 8 символов в формате MMDDYYYY):

DateSerial(Right(rst![Text Date], 4), Left(rst![Text Date], 2), Mid(rst![Text Date], 3, 2))
+1 Я всегда предпочитаю метод DateSerial
8

CDate() не примет вашу строку даты без какого-либо типа разделителя между частями месяца, дня и года. Эта попытка не удалась с ошибкой несоответствия типов.

Если это полезно, вы можете использовать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 

EditЕсли есть несоответствие между настройкой локали вашей системы и форматом ваших строк даты, вы можете преобразовать эти строки даты вyyyy-mm-dd формат, чтобы избежать проблем сCDate().

bar = "04122012" : Debug.Print CDate(Right(bar,4) & "-" & _
    Left(bar,2) & "-" & Mid(bar,3,2))
4/12/2012 
Спасибо @HansUp, я думал, что, должно быть, делал что-то глупое! regulus
+1 Очень точно.

Похожие вопросы