繁体   English   中英

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

[英]Convert this long Excel date formula into 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中所做的操作实际上没有任何区别,至少就在函数内调用函数而言:

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调用,就像Excel一样,VBA会将从LeftMid返回的表达式强制转换为数值-但我想在这类语句中明确显示转换。 但是,如果您不希望使用它们,则可以使用以下命令,该命令与Excel公式基本相同,除了DateSerial而不是DATE (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

由于Excel处理方式与VBA不同,因此必须在年份中加上1900。 Excel将20年定为1920年,将104年定为2004年。VBA使用窗口化方法,其中将少于30年的年份视为20yy,将30到99年之间的年份视为19yy,并将大于或等于30年的年份。 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM