将这个长的Exceldate公式转换成VBA

我有这个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中做到这一点?

这与Excel中的操作并没有什么不同,至less在函数内部调用函数时是这样的:

 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返回的expression式强制转换为数值,就像Excel一样 – 但是我希望在这些types的语句中显式地显示转换。 但是,如果你不想要它们,你可以使用下面的,除了DateSerial而不是DATE之外,它基本上与Excel公式相同。 (VBA Date函数只是返回今天的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 

因为Excel对VBA的处理方式不同,所以需要增加1900年。 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 

你可以尝试这样的事情…

 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