2012-05-08 83 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 

编辑:如果您的系统区域设置和你的日期字符串格式之间的不匹配,你可以改变这些日期字符串YYYY-MM-DD格式,以避免与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总是在MMDDYYYY格式8个字符):

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

+1我总是喜欢DateSerial方法 –