2012-05-08 3 views
3

Я пытаюсь преобразовать текстовое поле в дату, используя CDate() в наборе записей, но продолжаю получать ошибку несоответствия типа. Формат входного текста - MMDDYYYY. Не распознает ли 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 

ответ

7

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 

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

bar = "04122012" : Debug.Print CDate(Right(bar,4) & "-" & _ 
    Left(bar,2) & "-" & Mid(bar,3,2)) 
4/12/2012 
+0

Благодаря @HansUp, Я думал, что, должно быть, делал что-то глупое! – regulus

+0

+1 Очень точно. – jacouh

5

помощь для CDate говорит:

CDate распознает форматы даты в соответствии с локальными настройками вашей системы. Правильный порядок дня, месяца и года не может быть определен, если он предоставляется в формате, отличном от одного из признанных параметров даты.

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

DateSerial(Right(rst![Text Date], 4), Left(rst![Text Date], 2), Mid(rst![Text Date], 3, 2)) 
+1

+1 Я всегда предпочитаю метод DateSerial –

Смежные вопросы