我正在使用Excel VBA編寫UDF。我想用幾個不同的版本來重載我自己的UDF,以便不同的參數可以調用不同的函數。Excel中的函數重載和UDF VBA
由於VBA似乎不支持這一點,任何人都可以提出一個好的,非雜亂的方式來實現相同的目標?我應該使用可選參數還是有更好的方法?
我正在使用Excel VBA編寫UDF。我想用幾個不同的版本來重載我自己的UDF,以便不同的參數可以調用不同的函數。Excel中的函數重載和UDF VBA
由於VBA似乎不支持這一點,任何人都可以提出一個好的,非雜亂的方式來實現相同的目標?我應該使用可選參數還是有更好的方法?
聲明你的論點爲Optional Variants
,那麼你可以測試一下,看他們是否正在使用IsMissing()
或檢查使用TypeName()
其類型失蹤顯示在下面的例子:
Public Function Foo(Optional v As Variant) As Variant
If IsMissing(v) Then
Foo = "Missing argument"
ElseIf TypeName(v) = "String" Then
Foo = v & " plus one"
Else
Foo = v + 1
End If
End Function
這可以從一個工作表被稱爲= FOO(),= FOO(數),或= FOO( 「串」)。
VBA很混亂。我不知道有一個簡單的方法來做假過載:
在過去,我已經使用了大量的選項,或使用不同的功能。例如
Foo_DescriptiveName1()
Foo_DescriptiveName2()
我會說去與有合理的默認值,除非參數列表將會變得愚蠢,然後創建獨立的函數調用你的情況下可選參數。
也可能走要考慮使用一個變量數據類型爲你的參數列表,然後找出什麼是使用將typeof語句是什麼類型,然後調用相應的功能,當你弄清楚什麼是什麼...
如果您可以通過參數個數區分,那麼像這樣的工作:
Public Function Morph(ParamArray Args())
Select Case UBound(Args)
Case -1 '' nothing supplied
Morph = Morph_NoParams()
Case 0
Morph = Morph_One_Param(Args(0))
Case 1
Morph = Two_Param_Morph(Args(0), Args(1))
Case Else
Morph = CVErr(xlErrRef)
End Select
End Function
Private Function Morph_NoParams()
Morph_NoParams = "I'm parameterless"
End Function
Private Function Morph_One_Param(arg)
Morph_One_Param = "I has a parameter, it's " & arg
End Function
Private Function Two_Param_Morph(arg0, arg1)
Two_Param_Morph = "I is in 2-params and they is " & arg0 & "," & arg1
End Function
如果區分功能的唯一途徑是通過類型,那麼你有效地將要必須做的C++和其他覆蓋函數的語言,這是通過簽名來調用。我建議進行調用看起來像這樣:
Public Function MorphBySig(ParamArray args())
Dim sig As String
Dim idx As Long
Dim MorphInstance As MorphClass
For idx = LBound(args) To UBound(args)
sig = sig & TypeName(args(idx))
Next
Set MorphInstance = New MorphClass
MorphBySig = CallByName(MorphInstance, "Morph_" & sig, VbMethod, args)
End Function
,並創造了一些符合您所期望的簽名是方法的類。儘管如此,您可能需要一些錯誤處理,並且要警告可識別的類型是有限的:例如,日期是TypeName Double。
謝謝,這聽起來像是一個很好的做法。 – Patrick 2008-09-16 10:29:47