Подтвердить что ты не робот

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

Я использую Excel VBA для записи UDF. Я хотел бы перегрузить мой собственный UDF несколькими различными версиями, чтобы разные аргументы вызывали разные функции.

Как VBA, похоже, не поддерживает это, может ли кто-нибудь предложить хороший, не-грязный способ достижения той же цели? Должен ли я использовать необязательные аргументы или есть лучший способ?

4b9b3361

Ответ 1

Объявите свои аргументы как 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 ( "string" ).

Ответ 2

Если вы можете различить по количеству параметров, то что-то вроде этого будет работать:

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 " & 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

Если единственный способ отличить функцию от типов, то вам действительно нужно будет делать то, что делают С++ и другие языки с переопределенными функциями, которые должны вызывать подписи. Я предлагаю сделать вызов выглядеть примерно так:

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.

Ответ 3

VBA беспорядочен. Я не уверен, что есть простой способ сделать фальшивые перегрузки:

В прошлом я либо использовал множество опций, либо использовал разнообразные функции. Например,

Foo_DescriptiveName1()

Foo_DescriptiveName2()

Я бы сказал, идут с необязательными аргументами, которые имеют разумные значения по умолчанию, если список аргументов не станет глупым, а затем создайте отдельные функции для вызова ваших случаев.

Ответ 4

Вы также можете рассмотреть возможность использования варианта типа данных для списка аргументов, а затем выяснить, какой тип использует оператор TypeOf, а затем вызвать соответствующие функции, когда вы выясните, что...