Excel VBA中的函数重载和UDF

我使用Excel VBA编写UDF。 我想用几个不同的版本来重载我自己的UDF,以便不同的参数可以调用不同的函数。

由于VBA似乎不支持这一点,任何人都可以提出一个好的,非杂乱的方式来实现相同的目标? 我应该使用可选参数还是有更好的方法?

声明你的参数为Optional Variants ,然后你可以testing它们是否使用IsMissing()或者使用TypeName()检查它们的types,如下例所示:

 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(“ string ”)

如果你可以通过参数计数来区分,那么像这样的东西可以工作:

 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 

如果要区分函数的唯一方法是按types进行区分的话,那么实际上您将必须执行C ++和其他具有重写函数的语言,这是通过签名来调用的。 我build议让电话看起来像这样:

 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 

并创build一个类与您所期望的签名相匹配的许多方法。 尽pipe如此,您可能需要一些error handling,并且要警告可识别的types是有限的:例如,date是TypeName Double。

VBA很混乱。 我不确定有一个简单的方法来做假重载:

在过去,我使用了大量的Optionals,或者使用了不同的function。 例如

 Foo_DescriptiveName1() Foo_DescriptiveName2() 

我会说,去可选参数具有合理的默认值,除非参数列表将变得愚蠢,然后创build单独的函数来调用您的情况。

你也希望考虑使用一个变种数据types为你的参数列表,然后找出什么是使用TypeOf语句的types,然后调用适当的function,当你找出什么是…