这与您在 Excel 中所做的事情并没有什么不同,至少就在函数中调用函数而言:
Public Function getDate(input_date As String) As Date
getDate = DateSerial(1900 + CInt(Left(input_date, 3)), _
CInt(Mid(input_date, 6, 1)), _
Cint(Mid(input_date, 7, 1)))
End Function
CInt 调用不是绝对必要的,VBA 将强制从 Left 和 Mid 返回的表达式为数值,就像 Excel 所做的一样 - 但我喜欢在这类语句中明确显示转换.但是如果你不想要它们,你可以使用下面的,除了DateSerial而不是DATE之外,它与Excel公式基本相同。 (VBA Date 函数只返回今天的日期。)
Public Function getDate(input_date As String) As Date
getDate = DateSerial(1900 + Left(input_date, 3), Mid(input_date, 6, 1), Mid(input_date, 7, 1))
End Function
需要将 1900 添加到年份,因为 Excel 对 VBA 的处理方式不同。 Excel 将 20 年视为 1920,将 104 年视为 2004。VBA 使用窗口方法,其中小于 30 的年被视为 20yy,介于 30 和 99 之间的年被视为 19yy,大于或等于的年100 被视为 0yyy。
而且,虽然我强烈不鼓励使用它,但您可以使用 Evaluate 在 VBA 中使用完全相同的 EXCEL 公式:
Public Function getDate(input_date As String) As Variant
getDate = Evaluate("DATE(LEFT(""" & input_date & """,3),MID(""" & input_date & """,6,1),MID(""" & input_date & """,7,1))")
End Function