我有一个 VBA 宏,它可以读取 Excel 文件并需要处理其中的数据,包括一些日期。但是,根据导出这些文件的用户,这些工作表中的日期可能会写为YYYYMMDD、MM/DD/YYYY、DD.MM.YYYY等M/D/YYYY。全部仅格式化为文本。
到目前为止,我已经尝试解析字符串并创建一个新日期。当我遇到更多奇特的日期时,例如M/DD/YYYYor D.MM.YY,我的代码变得非常大并且看起来不太优雅。我已经搜索过,但找不到任何标准化的方法或函数来检测这几种日期格式并相应地转换它们。
我是否遗漏了某些内容,或者只是解析字符串是执行此操作的唯一可靠方法?
尝试此代码 - 它将转换以下任何格式: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