2008-09-15 120 views
24

我正在使用Excel VBA編寫UDF。我想用幾個不同的版本來重載我自己的UDF,以便不同的參數可以調用不同的函數。Excel中的函數重載和UDF VBA

由於VBA似乎不支持這一點,任何人都可以提出一個好的,非雜亂的方式來實現相同的目標?我應該使用可選參數還是有更好的方法?

回答

46

聲明你的論點爲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( 「」)

+0

謝謝,這聽起來像是一個很好的做法。 – Patrick 2008-09-16 10:29:47

0

VBA很混亂。我不知道有一個簡單的方法來做假過載:

在過去,我已經使用了大量的選項,或使用不同的功能。例如

Foo_DescriptiveName1() 

Foo_DescriptiveName2() 

我會說去與有合理的默認值,除非參數列表將會變得愚蠢,然後創建獨立的函數調用你的情況下可選參數。

0

也可能走要考慮使用一個變量數據類型爲你的參數列表,然後找出什麼是使用將typeof語句是什麼類型,然後調用相應的功能,當你弄清楚什麼是什麼...

3

如果您可以通過參數個數區分,那麼像這樣的工作:

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。