2016-04-01 4 views
0

Мне нужно вызвать функцию excel из VBA, а также в функции и.передать неопределенное количество аргументов функции VBA

Я не знаю, сколько переменных аргументов у меня (var1 to ...).

Есть ли способ преобразования массива и применения его в качестве параметров ...? :

Application.Run("MyFunct", fixParam1, fixParam2, var1, var2 ... varx) 

я, хотя в конце концов, есть что-то вроде kwargs в питона ...

Application.run("myFunct", fixParam1, fixParam2, kwargs(myArray)) 

Возможно, что-то с ParamArray?

mySub(fixParam1, fixParam2, ParamArray var() as Variant) 
    Application.run([here I'm not sure...??]) 
+0

Поскольку вы не можете изменить 'myFunct' (как вы сказали в комментариях), пожалуйста, дайте нам список определенных аргументов для 'myFunct'. Если вы не можете изменить его, вы должны его сопоставить. –

+0

myFunct определяется двумя фиксированными аргументами, и после этого от 1 до N дополнительных аргументов ... это трудность, которую я пытаюсь решить. Итак, я назову его один раз с fix1 fix2 var1, например, а после этого с fix1, fix2, var1, var2, var3 – OpenStove

ответ

0

Вы можете передать массив, если вы можете изменить myFunct справиться с этим. http://www.cpearson.com/excel/passingandreturningarrays.htm

Application.run("myFunct", fixParam1, fixParam2, myArray) 

Так я выводя, что myFunct принимает аргументы вроде: fixParam1, fixParam2, [var1], [var2], ... Кронштейны обозначают необязательные аргументы. Таким образом, у вас может быть несколько необязательных аргументов.

ВАРИАНТ 1 Так создать массив со всеми аргументами и назвать его так:

Application.Run("MyFunct", fixParam1, fixParam2, myArray(0), myArray(1), _ 
    myArray(2), myArray(3), myArray(4), myArray(5)) 

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

ВАРИАНТ 2 Если myFunct не может обрабатывать дополнительные аргументы, которые вы, возможно, придется сделать что-то вроде этого:

Select Case argCount 
    Case 1 
     Call Application.Run("MyFunct", fixParam1, fixParam2, myArray(0)) 
    Case 2 
     Call Application.Run("MyFunct", fixParam1, fixParam2, myArray(0), myArray(1)) 
    Case 3 
     Call Application.Run("MyFunct", fixParam1, fixParam2, myArray(0), myArray(1), myArray(2)) 
    Case 4 
     Call Application.Run("MyFunct", fixParam1, fixParam2, myArray(0), myArray(1), myArray(2), myArray(3)) 
End Select 

Не очень, но работает.

+0

На самом деле, я не объяснил это хорошо, «myFunct» - это заданная функция, я могу 't change ... Вы имеете в виду, что вызываемая функция будет автоматически воспринимать массив как новые параметры? В этом случае было бы невозможно передать массивы в качестве аргументов ... кажется странным – OpenStove

+0

Аргумент - это просто данные. Поэтому, если вам нужно передать неизвестное количество значений, используйте массив. –

+0

Поскольку myFunct не изменчив, вам нужно его сопоставить. Вы не можете передавать более или менее аргументы, чем указано. Некоторые из аргументов могут быть необязательными, что позволяет использовать некоторую гибкость. –

1

определить функцию, которая принимает массив в качестве параметра, как это:

Function testFunction(args()) 

Затем вы можете передать массив в функции:

testFunction myArray