让VBA转换不同的日期格式

Jul*_*n B 2 excel vba date

我有一个 VBA 宏,它可以读取 Excel 文件并需要处理其中的数据,包括一些日期。但是,根据导出这些文件的用户,这些工作表中的日期可能会写为YYYYMMDDMM/DD/YYYYDD.MM.YYYYM/D/YYYY。全部仅格式化为文本。

到目前为止,我已经尝试解析字符串并创建一个新日期。当我遇到更多奇特的日期时,例如M/DD/YYYYor D.MM.YY,我的代码变得非常大并且看起来不太优雅。我已经搜索过,但找不到任何标准化的方法或函数来检测这几种日期格式并相应地转换它们。

我是否遗漏了某些内容,或者只是解析字符串是执行此操作的唯一可靠方法?

Pet*_*ert 5

尝试此代码 - 它将转换以下任何格式:DD.MM.YYYY, DD.MM.YY, YYYYMMDD, MM/DD/YYYY, MM/DD/YY, M/D/YYYY, M/D/YY

您可以轻松添加其他格式,只需向If...ElseIf...语句添加更多转换规则即可。

Option Explicit

Private mStrLastPattern As String
Private mStrSourceDate As String
Private mDatResult As Date

Public Function fctDateFromString(strDate As String) As Date
    mStrSourceDate = strDate
    mDatResult = 0
    If TryConvert("(^\d{2})\.(\d{2})\.(\d{4})$", "$2/$1/$3") Then       'DD.MM.YYYY
    ElseIf TryConvert("(^\d{2})\.(\d{2})\.(\d{2})$", "$2/$1/20$3") Then 'DD.MM.YY
    ElseIf TryConvert("(^\d{4})(\d{2})\.(\d{2})$", "$2/$3/$1") Then     'YYYYMMDD
    ElseIf TryConvert("(^\d{2})/(\d{2})/(\d{4})$", "$1/$2/$3") Then     'MM/DD/YYYY
    ElseIf TryConvert("(^\d{2})/(\d{2})/(\d{2})$", "$1/$2/20$3") Then   'MM/DD/YY
    ElseIf TryConvert("(^\d{1})/(\d{1})/(\d{4})$", "0$1/0$2/$3") Then   'M/D/YYYY
    ElseIf TryConvert("(^\d{1})/(\d{1})/(\d{2})$", "0$1/0$2/20$3") Then 'M/D/YY
    End If
    If mDatResult = 0 Then Debug.Print "Cannot find matching format for " & strDate
    fctDateFromString = mDatResult
End Function

Private Function TryConvert(strFrom As String, strTo As String) As Boolean
    If RegExMatch(strFrom) Then
        mDatResult = RegExConvert("$1/$2/$3")
        TryConvert = (mDatResult <> 0)
    End If
End Function

Private Function RegExMatch(strPattern As String) As Boolean
    mStrLastPattern = strPattern
    With CreateObject("VBScript.RegExp")
        .Pattern = strPattern
        .IgnoreCase = True
        .MultiLine = False
        RegExMatch = .Test(mStrSourceDate)
    End With
End Function

Private Function RegExConvert(strReplacePattern As String) As Date
    On Error Resume Next
    With CreateObject("VBScript.RegExp")
        .Pattern = mStrLastPattern
        .IgnoreCase = True
        .MultiLine = False
        RegExConvert = CDate(.Replace(mStrSourceDate, strReplacePattern))
        If Err.Number Then
            Err.Clear
            RegExConvert = 0
        End If
    End With

End Function
Run Code Online (Sandbox Code Playgroud)

请注意,只要位数匹配且结果日期有效,此代码就会解释MM.DD.YYYY为等。DD.MM.YYYY