Excel VBA中的函数重载和UDF

Excel VBA中的函数重载和UDF

Function Overloading and UDF in Excel VBA

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

由于VBA似乎不支持此功能,因此有人可以建议一种实现同一目标的好方法,而不是杂乱无章吗? 我应该使用可选参数还是有更好的方法?


将参数声明为Optional Variants,然后可以使用IsMissing()进行测试以查看是否缺少参数,或者使用TypeName()检查其类型,如以下示例所示:

1
2
3
4
5
6
7
8
9
10
11
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")。


如果您可以通过参数计数来区分,则可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 ++和其他具有被覆盖功能的语言所执行的操作,即按签名进行调用。我建议使通话看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。


您可能还想考虑对参数列表使用变量数据类型,然后使用TypeOf语句找出什么类型,然后在找出什么内容时调用适当的函数...


VBA杂乱无章。我不确定是否有简单的方法来进行假重载:

过去,我要么使用了大量的Optionals,要么使用了多种功能。例如

1
2
3
Foo_DescriptiveName1()

Foo_DescriptiveName2()

我想说说带有可选默认值的可选参数,除非参数列表变得愚蠢,然后创建单独的函数来调用您的案例。


推荐阅读

    linuxrm命令参数?

    linuxrm命令参数?,系统,命令,文件,目录,环境,档案,文件夹,终端,参数,子目录,l

    linux使用命令的方法?

    linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

    linux命令行定义参数?

    linux命令行定义参数?,系统,信息,名称,实时,命令,百分比,工作,周期,选项,参

    linux命令查询参数?

    linux命令查询参数?,网络,信息,设备,系统,服务,状态,情况,工作,地址,命令,Lin

    linux网络参数命令?

    linux网络参数命令?,网络,地址,系统,工作,信息,工具,情况,服务,状态,命令,Lin

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux的cd命令参数?

    linux的cd命令参数?,工作,地址,系统,命令,一致,目录,信息,基础,名称,管理,lin

    linux下cd命令参数?

    linux下cd命令参数?,工作,命令,系统,一致,名称,目录,用户,缩写,意思,参数,lin

    linux各种命令的参数?

    linux各种命令的参数?,网络,信息,工作,地址,系统,情况,服务,命令,软件,数据,l

    linux命令行参数长度?

    linux命令行参数长度?,系统,信息,实时,工具,工作,名称,环境,百分比,标准,情

    linux添加命令参数?

    linux添加命令参数?,系统,管理,工作,基础,命令,情况,网络,工具,代码,环境,别

    linux命令参数长度?

    linux命令参数长度?,工作,系统,信息,基础,网络,环境,情况,管理,长度,命令,Lin

    linux安装参数命令?

    linux安装参数命令?,工作,系统,软件,地址,命令,中心,在线,地方,位置,信息,Lin

    linux的命令的参数?

    linux的命令的参数?,网络,工作,系统,信息,情况,服务,命令,状态,数据,标准,Lin

    linux命令传入参数?

    linux命令传入参数?,系统,地址,工作,命令,信息,名称,代码,名字,服务,管理,如

    linux命令行参数的和?

    linux命令行参数的和?,系统,地址,管理,命令,基础,数字,网络,情况,下降,信息,

    linux带参数的命令?

    linux带参数的命令?,网络,地址,工作,信息,系统,情况,状态,服务,目录,命令,Lin

    linux查询函数命令?

    linux查询函数命令?,系统,信息,名称,标准,函数,百度,代码,名字,最新,实时,Lin

    linux内核命令行参数?

    linux内核命令行参数?,系统,地址,工作,信息,命令,设备,第一,时间,服务,情况,l

    linux命令参数过长?

    linux命令参数过长?,系统,管理,工作,命令,基础,环境,位置,档案,名称,信息,新