当前位置:  开发笔记 > 后端 > 正文

Excel VBA中的函数重载和UDF

如何解决《ExcelVBA中的函数重载和UDF》经验,为你挑选了2个好方法。

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

由于VBA似乎不支持这一点,任何人都可以建议一种实现同一目标的良好,非凌乱的方式吗?我应该使用可选参数还是有更好的方法?



1> Joel Spolsky..:

将您的参数声明为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(" 字符串 ").


是的.这对Excel非常重要,因为我们觉得电子表格单元格中的任何内容都应该能够进入Basic变量,否则读取单元格的简单行为将需要几行代码.
这模糊了函数的有效签名.不幸的是,VBA不允许使用不同参数类型的多个同名函数.

2> Mike Woodhou..:

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

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.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有