CDate类型不匹配错误

5
我正在尝试使用CDate()在记录集中将文本字段转换为日期,但不断收到类型不匹配的错误。输入文本格式为MMDDYYYY。 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个回答

13

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 

谢谢@HansUp,我以为我一定做错了什么! - regulus

6

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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接