将此长Excel日期公式转换为VBA

时间:2017-05-21 08:28:12

标签: excel vba excel-vba date

我在下面有这个Excel公式;

DATE(LEFT(A1,3),MID(A1,6,1),MID(A1,7,1))

我想将此Excel公式转换为VBA用户定义函数。

Public Function getDate(input_date As String)
    'code to convert DATE(LEFT(A1,3),MID(A1,6,1),MID(A1,7,1)) to VBA
End Function

这很棘手,因为函数参数中使用了函数。就像DATE里面使用的LEFT一样。

编辑:如果可能的话,我想直接在VBA函数中使用Excel公式,只需要很少的修改。是否可以在Excel VBA中执行此操作?

2 个答案:

答案 0 :(得分:4)

与你在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会将LeftMid返回的表达式强制转换为数值,就像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

答案 1 :(得分:1)

你可以试试这样的......

Public Function getDate(input_date As String)
    getDate = CDate(Evaluate("DATE(LEFT(" & input_date & ",4),MID(" & input_date & ",5,2),MID(" & input_date & ",7,2))"))
End Function

Sub Test()
MsgBox getDate("20170521")
End Sub