2014-10-09 2 views
0

У меня есть функция myfunction. он имеет 10 необязательных аргументов. Это вызывает другую функцию, называемую myotherfunction, которая имеет те же 10 необязательных аргументов.Как передать дополнительные аргументы другой функции, которая имеет необязательные аргументы

Итак, позвольте мне назвать myfunction только одним аргументом. Как вызвать myotherfunction, используя только один аргумент, когда я не знаю, какой из 10 необязательных аргументов был передан?

Я не могу сказать ret_value = myotherfunction (arg1: = argumentone), потому что может быть от 1 до 10 аргументов, которые мне нужно передать. Если бы я использовал 2 аргумента, это должно было бы быть ret_value = myotherfunction (arg1: = argumentone, arg2: = argumenttwo), но снова во время выполнения я не знаю, какие аргументы были переданы моей функции. Есть ли способ разобрать вызов функции?

ответ

1

Использование IsMissing.

If IsMissing(arg1) Then 
    'do something 
End If 

Он работает только для Variant типа.

+0

Возможно, стоит отметить, что функция 'IsMissing' работает только с опциональным параметром' Variant'. Подробнее в [Функция IsMissing] (http://msdn.microsoft.com/en-us/library/aa445048 (v = vs.60) .aspx) – Jeeped

2

Просто передайте аргументы вдоль цепи. В очень упрощенном примере:

Sub foo() 
    Call bar("test") 
End Sub 
Sub bar(sOne As String, Optional sTwo) 
    Call foobar(sOne, sTwo) 
End Sub 
Sub foobar(strOne As String, Optional strTwo) 
    If IsMissing(strTwo) Then 
     MsgBox strOne 
    Else 
     MsgBox strOne & "- " & strTwo 
    End If 
End Sub 

Замечание: при IsMissing в Foobar только чтобы показать, что каждая подпрограмма должна проверить необязательные аргументы, прежде чем делать что-либо с ними. Возможно, более ярким примером их простоты является:

Sub foo() 
    ' note only one parameter provided 
    Call bar("test") 
End Sub 
Sub bar(sOne As String, Optional sTwo, Optional sThree, Optional sFour) 
    ' still pass all parameters even if we only got one 
    Call foobar(sOne, sTwo, sThree, sFour) 
End Sub 
Sub foobar(strOne As String, Optional strTwo, Optional strThree, Optional strFour) 
    ' some code here 
End Sub 
+0

Проблема в том, что может быть любая комбинация из 10 переменных. Я могу, конечно, использовать ismissing, чтобы узнать, какие переменные были переданы во время выполнения, но как мне построить второй вызов функции на этапе проектирования для удовлетворения всех этих комбинаций? –

+0

Я думаю, что вам не хватает моей точки. Просто передайте * все те же переменные * от первой подпрограммы ко второй. Не утруждайте себя тестированием. Обратите внимание, что 'Call foobar (sOne, sTwo)' не проверяет или не заботится о том, передано ли sTwo на 'bar' или нет, оно просто передает его. Честно говоря, 10 необязательных аргументов кажутся плохим дизайном для меня - возможно, вам нужен ParamArray или UDT/Class. – Rory

+0

Ну, я полагаю, я искал более элегантное решение. Но похоже, что нет. 10 необязательных аргументов используются API, по которому я отправляю запросы. Я не могу это изменить. Спасибо за вашу помощь. –

Смежные вопросы