Страницы: 1
RSS
vba Передать аргументы полученные by ParamArray в другую процедуру
 
Здравствуйте.
Подскажите, пожалуйста, как элегантно передать все полученные аргументы далее (без дикости с их перечислением и проверкой на существование каждого).
Код
Sub f1()
    f2 1, 2, 3
End Sub

Sub f2(ParamArray a())
'    f3 a()
    f3 a(0), a(1), a(2)
End Sub

Sub f3(ParamArray a())
    Dim c
    Debug.Print TypeName(a), UBound(a) + 1
    For Each c In a
        Debug.Print c
    Next
End Sub
 
Что Вы в принципе хотите? Не КАК Вы это хотите, а ЧТО? Где Вы массив a() данными наполняете например?
Согласие есть продукт при полном непротивлении сторон
 
Их *нескольких* f1 я передаю выбранные по определённому критерию листы книги (в каждой f1 свой набор) в процедуру f2, где сами листы не нужны, но f2 аккумулирующая: в ней выполняется общий код, который иначе я вынужден был бы мультиплицировать в каждой f1 (f2, по сути, используется из эстетических соображений).
После результат работы f2  (один/два аргумента, наряду с полученными аргументами-листами) передается уже в конечную f3.
Изменено: vladjuha - 08.03.2017 09:23:22
 
если ParamArray хотите скинуть в Sub - как-то так из ваших набросков
Код
Sub f1()
    f3 1, 2, 3
End Sub
 
Sub f2()
Dim ar As Variant
ReDim ar(0 To 2)
ar(0) = 2
ar(1) = 4
ar(2) = 6
    f3 ar(0), ar(1), ar(2)    
End Sub
 
Sub f3(ParamArray ar())
    Dim c    
    For Each c In ar
        Debug.Print c
        i = i + 1
    Next
    iCount = i  'кол-во
    MsgBox iCount   'РЕЗУЛЬТАТ кол-во
End Sub
но лучше прикладывайте файл с отражением - Что есть и Что надо...
p.s.
может, там вообще ваши листы можно взять в массив, в теле основной процедуры идти по массиву и скидывать каждый его элемент на обработку в доп. процедуру/функцию
Изменено: JeyCi - 08.03.2017 09:37:48
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, спасибо, но дело в том, что заранее неизвестно сколько будет передано аргументов из f1
 
если скидываете в Функцию (т.е. результат надо вернуть в основную процедуру)
Код
Sub f1()
    iCount = f3(1, 2, 3)
    MsgBox iCount   'РЕЗУЛЬТАТ
End Sub
 
Sub f2()
Dim ar As Variant
ReDim ar(0 To 2)
ar(0) = 2
ar(1) = 4
ar(2) = 6
    iCount = f3(ar(0), ar(1), ar(2))
    MsgBox iCount   'РЕЗУЛЬТАТ
End Sub
 
Function f3(ParamArray ar())
    Dim c    
    For Each c In ar
        Debug.Print c
        i = i + 1
    Next
    f3 = i  'кол-во    
End Function

Изменено: JeyCi - 08.03.2017 09:39:22
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
vladjuha написал: заранее неизвестно сколько будет передано аргументов из f1
почему неизвестно? - аргументы забиваете в массив... и Ubound(arr) - чем не нравится? - будет вам известно то количество (если надо)
***
либо просто передавайте этот заполненный массив - в Функцию
Код
Sub f2()
Dim ar As Variant
ReDim ar(0 To 2)
ar(0) = 2
ar(1) = 4
ar(2) = 6
    iCount = f3(ar)
    MsgBox iCount   'РЕЗУЛЬТАТ
End Sub
 
Function f3(ar As Variant)
    Dim c
    For Each c In ar
        Debug.Print c
        i = i + 1
    Next
    f3 = i  'кол-во    
End Function
или в Процедуру
Код
Sub f2()
Dim ar As Variant
ReDim ar(0 To 2)
ar(0) = 2
ar(1) = 4
ar(2) = 6
    f3 (ar)
End Sub

Sub f3(ar As Variant)
    Dim c
    For Each c In ar
        Debug.Print c
        i = i + 1
    Next
    iCount = i  'кол-во
    MsgBox iCount   'РЕЗУЛЬТАТ
End Sub
Изменено: JeyCi - 08.03.2017 10:03:43
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Да, как массив, вариант, спасибо. Просто не хотелось конечную f3 перетачивать (противоречит её "идейности)".
 
Непонятно зачем вообще ParamArray. Не вижу ни намека на пользовательскую функцию, в которой это востребовано, т.к. неизвестно сколько аргументов задаст пользователь. По сути ParamArray это динамический массив, создаваемый самим VBA на лету.
Здесь же количество аргументов задается внутри процедуры. Посему нечего выдумать бред всякий - лучше поглубже изучить массивы в принципе.
Код
Sub f1()
    f2 array(1, 2, 3)
End Sub
 
Sub f2(a)
    f3 a
End Sub
 
Sub f3(a)
    Dim c
    Debug.Print TypeName(a), UBound(a) + 1
    For Each c In a
        Debug.Print c
    Next
End Sub

Необходимость процедуры f2 тоже не очень понял, но оставил для примера.
Изменено: The_Prist - 08.03.2017 10:04:51
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
vladjuha написал: Просто не хотелось конечную f3 перетачивать  (противоречит её "идейности)".
"идейность" странная... переделайте один раз, а потом массив хоть в сколько угодно элементов скидывайте в неё, хоть массив в 1 или любое известное кол-во элементов... или у вас есть конкретные обоснования удобства не-переточенной функции?.. (значит вы что-то недоговорили - в таких случаях файл лучше скажет сам за себя)...
Изменено: JeyCi - 08.03.2017 10:08:28
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх