Excel VBA中的函数重载和UDF
时间:2020-03-05 18:53:54 来源:igfitidea点击:
我正在使用Excel VBA编写UDF。我想用两个不同的版本重载自己的UDF,以便不同的参数将调用不同的函数。
由于VBA似乎不支持此功能,因此有人可以建议一种实现同一目标的好方法,而不是杂乱无章吗?我应该使用可选参数还是有更好的方法?
解决方案
回答
VBA杂乱无章。我不确定是否有简单的方法来进行假重载:
过去,我或者使用了大量的Optionals,或者使用了多种功能。例如
Foo_DescriptiveName1() Foo_DescriptiveName2()
我想说说带有可选默认值的可选参数,除非参数列表变得愚蠢,然后创建单独的函数来调用案例。
回答
我们可能还想考虑对参数列表使用变量数据类型,然后使用TypeOf语句找出什么类型,然后在找出什么内容时调用适当的函数...
回答
将参数声明为"可选变体",然后可以使用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(number)或者= 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
如果区分功能的唯一方法是按类型区分,那么我们实际上将不得不执行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。