首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA中的函数重载和UDF

Excel VBA中的函数重载和UDF
EN

Stack Overflow用户
提问于 2008-09-15 16:28:28
回答 4查看 34.5K关注 0票数 31

我正在使用Excel VBA来编写一个UDF。我想用几个不同的版本重载我自己的UDF,这样不同的参数将调用不同的函数。

由于VBA似乎不支持这一点,有没有人能建议一个好的,不混乱的方法来实现同样的目标呢?我应该使用可选参数,还是有更好的方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-09-16 08:59:23

将参数声明为Optional Variants,然后可以使用IsMissing()测试它们是否缺失,或者使用TypeName()检查它们的类型,如下面的示例所示:

代码语言:javascript
复制
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(number),或=FOO("string").的形式调用=FOO()

票数 57
EN

Stack Overflow用户

发布于 2008-09-16 10:51:42

如果您可以通过参数计数来区分,那么下面这样的代码将会起作用:

代码语言:javascript
复制
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++和其他具有覆盖函数的语言所做的事情,即通过签名调用。我建议让调用看起来像这样:

代码语言:javascript
复制
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。

票数 7
EN

Stack Overflow用户

发布于 2008-09-15 16:35:21

VBA是凌乱的。我不确定有没有一种简单的方法来做假重载:

在过去,我要么使用了很多可选的,要么使用了不同的函数。例如

代码语言:javascript
复制
Foo_DescriptiveName1()

Foo_DescriptiveName2()

我建议使用具有合理默认值的可选参数,除非参数列表将变得愚蠢,然后创建单独的函数来调用您的案例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档