4

我正在尝试使用记录集中的 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
4

2 回答 2

11

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 
于 2012-05-08T17:07:23.310 回答
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))
于 2012-05-08T21:35:34.900 回答