在Access VBA中使用CDate()的类型不兼容

时间:2016-03-30 07:13:03

标签: vba ms-access

我使用VBA计算MS Access中的日期。这在我在同一表格上有两个日期(2016-01-21)时工作正常,但是当我第一次需要将字符串修改为日期格式时,这不是这样的:20160121 - > 2016年1月21日

这就是我想要做的事情:

Dim sYear As String, sMonth As String, sDay As String, sDate As String

sYear = Left("20160121", 4)
sMonth = Mid("20160121", 5, 2)
sDay = Mid("20160121", 7, 2)

sDate = sYear & "-" & sMonth & "-" & sDay

MsgBox CDate(sDate)

这将返回错误13,不兼容的类型。

但这有效:

MsgBox CDate("2016-01-21")

为什么我的工作方式不合适?

2 个答案:

答案 0 :(得分:1)

您必须决定如何处理无效的输入值。

一种选择是提供您选择的默认日期,今天的日期或此处 1980-01-01

Public Function ConvertDate(ByVal TextDate As String) As Date

    Dim RealDate    As Date
    Dim NullDate    As Date

    NullDate = #1/1/1980#

    TextDate = Format(TextDate, "@@@@/@@/@@")
    If IsDate(TextDate) Then
        RealDate = CDate(TextDate)
    Else
        RealDate = NullDate
    End If

    ConvertDate = RealDate

End Function

将返回:

20160121 -> 2016-01-21
20160141 -> 1980-01-01

或者您可以将RealDate的数据类型更改为 Variant ,并为无效日期返回 Null

Public Function ConvertDate(ByVal TextDate As String) As Variant

    Dim RealDate    As Variant
    Dim NullDate    As Variant

    NullDate = Null     

    TextDate = Format(TextDate, "@@@@/@@/@@")
    If IsDate(TextDate) Then
        RealDate = CDate(TextDate)
    Else
        RealDate = NullDate
    End If

    ConvertDate = RealDate

End Function

将返回:

20160121 -> 2016-01-21
20160141 -> Null

答案 1 :(得分:0)

错误是因为我测试的是假日期:12345678。如果日期正确,它可以正常工作......