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

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
28
задан Community 9 July 2018 в 18:41
поделиться

4 ответа

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

51
ответ дан Joel Spolsky 28 November 2019 в 03:05
поделиться

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

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 Дважды, например.

5
ответ дан Lance Roberts 28 November 2019 в 03:05
поделиться

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

В прошлом я или использовал много Optionals или использовал, варьировался функции. Например

Foo_DescriptiveName1()

Foo_DescriptiveName2()

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

0
ответ дан theo 28 November 2019 в 03:05
поделиться

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

0
ответ дан Jon Fournier 28 November 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: