簡體   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