CDate类型不匹配错误

reg*_*lus 4 ms-access vba

我正在尝试使用记录集中的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
Run Code Online (Sandbox Code Playgroud)

Han*_*sUp 8

CDate()如果月份,日期和年份之间没有某种类型的分隔符,则不接受您的日期字符串.此尝试因类型不匹配错误而失败.

? CDate("04122012")
Run Code Online (Sandbox Code Playgroud)

如果它有用,您可以使用该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 
Run Code Online (Sandbox Code Playgroud)

编辑:如果系统的区域设置与日期字符串的格式不匹配,则可以将这些日期字符串转换为yyyy-mm-dd格式以避免出现问题CDate().

bar = "04122012" : Debug.Print CDate(Right(bar,4) & "-" & _
    Left(bar,2) & "-" & Mid(bar,3,2))
4/12/2012 
Run Code Online (Sandbox Code Playgroud)


Bri*_*ire 5

帮助CDate说:

CDate根据系统的区域设置识别日期格式.如果以不同于其中一个识别日期设置的格式提供日,月和年的正确顺序,则可能无法确定.

为了避免由于语言环境设置造成的混淆,您可以使用DateSerial而不是CDate像这样的表达式(假设Text DateMMDDYYYY格式总是有8个字符):

DateSerial(Right(rst![Text Date], 4), Left(rst![Text Date], 2), Mid(rst![Text Date], 3, 2))
Run Code Online (Sandbox Code Playgroud)