Есть ли способ определить, какие необязательные аргументы были даны при вызове функции VBA? - PullRequest
1 голос
/ 03 октября 2011

Скажем, у меня есть функция VBA с необязательным аргументом.Можно ли из этой функции определить, предоставил ли вызывающий код необязательный аргумент или нет?

Public Function SomeFunction(optional argument as Integer = 0) As Integer

End Function

т.е. есть ли способ определить разницу между следующими вызовами?

x = SomeFunction()
x = SomeFunction(0)

Ответы [ 2 ]

4 голосов
/ 03 октября 2011

Насколько я знаю, это невозможно.Если аргумент не передается, то аргумент инициализируется до значения по умолчанию (в данном случае 0).

Одним из способов решения этой проблемы является изменение типа переменной на Variant и использование функции IsMissing для проверкипередан ли аргумент или нет.Пример:

Public Function SomeFunction(Optional argument As Variant) As Integer
    If IsMissing(argument) Then
        argument = 0
    Else
        // Code if argument not = 0....
    End If
End Function

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

0 голосов
/ 03 октября 2011

Нет, нет.

Та же проблема существует в другом языке, таком как C #, как ясно выражено в "C # In Depth", Глава 13.1.1 (я читал эту часть 15 минут назад, это нормально, я помню это!)

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

Редактировать: Точно так же, как @Remnant сказал в своем ответе, чтобы иметь возможность сделать это, тип параметра должен быть вариантом.

...