将这个长的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将把Left
和Mid
返回的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