VBA/Excel 经常会尝试确定日期并弄错。
例如
dt = DateSerial(2012, 14, 42) 'returns #14/03/2013#
dtReal = IsDate("09 / 14 / 2012") 'returns TRUE when we really wanted to test dd/mm/yyyy - there's no 14th month.
我经常使用下面的代码,它是一种更长但万无一失的确定字符串日期是否真实并将其作为日期返回的方法。
Option Explicit
    Sub test()
    Dim testDate As Boolean
    Dim dt As Date
    testDate = IsTextDate("05/07/2012", dt, "dd/mm/yyyy") 'Could pass "mm/dd/yyyy" instead
    If testDate = True Then
        Debug.Print "Valid Date " & Format(dt, "dd-mmm-yyyy")
    Else
        Debug.Print "Invalid Date"
    End If
    End Sub
    Function IsTextDate(ByVal str As String, ByRef dt As Date, Optional dtFormat As String = "dd/mm/yyyy") As Boolean
    Dim D As Date
    Dim day As Integer
    Dim month As Integer
    Dim year As Long
    Dim daysinFeb As Integer
    Dim dtArray() As String
    'Test input string mask matches date format
    If Not (str Like "##/##/####") Then
        'Debug.Print "Invalid Date"
        Exit Function
    Else
        'split string on delimiter and extract correct 'dd' and 'mm' based on UK/US format
        dtArray = Split(str, "/")
        year = CInt(dtArray(2))
        If dtFormat = "dd/mm/yyyy" Then
            day = CInt(dtArray(0))
            month = CInt(dtArray(1))
        Else
            day = CInt(dtArray(1))
            month = CInt(dtArray(0))
        End If
        'determine days in Feb for year given.
        If IsDate("2/29/" & year) Then
            daysinFeb = 29
        Else
            daysinFeb = 28
        End If
        'determine if date is valid
        Select Case month
            Case 9, 4, 6, 11
                '30 days
                If day <= 30 Then IsTextDate = True
            Case 1, 3, 5, 7, 8, 10, 12
                '31 days
                If day <= 31 Then IsTextDate = True
            Case 2
                'either 28 or 19 days
                If day <= daysinFeb Then IsTextDate = True
        End Select
        If IsTextDate Then dt = DateSerial(year, month, day)
    End If
    End Function