Перегрузка функций и UDF в Excel VBA

Если вы можете различать excel-macro по количеству параметров, то macros-vba будет работать что-то вроде table-valued-functions этого:

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

Если единственный способ visual-basic-applications отличить функцию — по типам, то table-valued-functions вам фактически придется делать visual-basic-applications то, что делают C++ и другие excel-macro языки с переопределенными excel функциями, то есть вызывать scalar-function по сигнатуре. Я бы предложил excel сделать звонок примерно таким:

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

и user-defined-functions создание класса с набором scalar-function методов, соответствующих user-defined-functions ожидаемым сигнатурам. Однако udf вам, вероятно, потребуется workbook некоторая обработка ошибок, и excel имейте в виду, что распознаваемые user-defined-functions типы ограничены: например, даты user-defined-functions — это TypeName Double.

excel

user-defined-functions

vba

2022-10-06T18:46:06+00:00