Страницы: 1
RSS
передача в функцию неизвестного количества параметров, необходимо собрать range из неизвестного количества range)
 
Господа, простая задача по вычислению среднего с условиями из неизвестного количества диапазонов завела меня в тупик. прошу вашей помощи
 
Поиск по словам ParamArray должен навести на мысли
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо. навел.
подскажите что не так в строчке Function srednee(ParamArray rng() As range)
ну то есть мне ясно дали понять что рнг должен быть массивом или вариантом но я всеж не въеду что я ему не так пишу
 
эм. сорь. туплю
 
Цитата
VideoAlex написал:
что я ему не так пишу
тип уберите. ParamArray объявляется без типа данных
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
VideoAlex, используйте объединение диапазонов: скобки при вызове функции с листа например
Код
=srednee((A1:B10;D3:D5;F1:H2))
В VBA диапазоны можно объединять как Range("A1:B10,D3:D5,F1:H2") или union(Range("A1:B10"),Range("D3:D5"),Range("F1:H2")) или комбинировать эти способы.
При этом функция объявлена как
Код
Function srednee(rng As range)
 
Казанский, +
только так и поступаю — двойные скобки рулят)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
только так и поступаю
это только если для себя любимого - для пользователей не всегда это лучший выход. Они привыкли не помнить такие элементарные вещи, как лишние скобки :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, я тут большую красную кнопку сделал, по нажатию на которую, макрос выполняет кучу проверок и выводит лог о результатах. Так вот теперь люди просто "забывают" нажать кнопку или же делают проверку не в самом конце, а перед тем, как НАЧАТЬ заполнение — так что доверять этим товарищам себе дороже  :D

кроме того, ParamArray полон недостатков и сюрпризов — я же как-то по вашей подсказке имел уже с ним дело. Вот после этого и перешёл на двойные скобки))) их мне с лихвой хватает. А юзерам сделал методичку, куда тыкаю по FAQ. Чем больше работают, тем меньше вопросов  ;)
Изменено: Jack Famous - 03.04.2018 16:18:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
я же как-то по вашей подсказке имел уже с ним дело. Вот после этого и перешёл на двойные скобки
я тоже не раз имел дело с ParamArray и без двойных скобок все отлично, никаких сюрпризов. Главное правильно обработать все входящие данные :) Если не изменяет память, тебе тогда пришлось от ParamArray уйти по причине пробела в знаниях относительно переделки кода под свои нужды. Но никак не из-за того, что пользователям там проще :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий Щербаков написал:
не изменяет память
вроде так всё и было)) что-то там меня смутило в работе с ним - то ли другие переменные как-то иначе передаются, то ли Optional нельзя… не суть, в общем  :D
Цитата
Дмитрий Щербаков написал:
никак не из-за того, что пользователям там проще
я о пользователях думаю косвенно)) если я знаю, как эта штука работает, то пользователи в безопасности :D  в случае ParamArray это не так))
Изменено: Jack Famous - 03.04.2018 17:11:30
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
попробовал обычную формулу =СРЗНАЧЕСЛИ((Q83:Q87;Q78:Q80);">0")
обработчик раскрыл скобки и получил ТРИ параметра вместо двух. как следствие - #ЗНАЧ!

тем не менее с пользовательской это сработало. спасибо всем огромное.
Изменено: VideoAlex - 04.04.2018 05:24:46
 
Я в этой статье постарался более подробно описать передачу аргументов в пользовательские функции: Что такое функция пользователя(UDF)?
Там и про ParamArray и про Optional и про некоторые нюансы их применения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, спасибо огромное. Очень познавательно
 
Дмитрий Щербаков, спасибо за обновление — стало намного яснее  ;)  Мне пока скобочек хватает и, как я понял, пока нет реальной необходимости в ParamArray))

У меня предложение — если посчитаешь нужным, то дополни, пожалуйста, статью примерами с byVal и byRef, а то я до конца так и не понял, как именно они работают (типа передают ссылкой или значением, в чём разница, что будет, если не указано и т.д.)  :idea:
Изменено: Jack Famous - 04.04.2018 10:34:37
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
оффтопчик
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Jack Famous написал:
с byVal и byRef, а то я до конца так и не понял, как именно они работают (типа передают ссылкой или значением, в чём разница, что будет, если не указано и т.д.)
ByVal - передача параметра, как значение. В ходе работы функции/процедуры с переданной этой функции/процедуре переменной (если передавали через переменную, а не напрямую или через выражение) ничего не произойдет. Все операции с таким параметром будут происходить только в рамках процедуры/функции.
ByRef (указывать не обязательно, он по дефолту) - здесь все интереснее, т.к. все переменные переданные процедуре/функции в ходе работы последней изменят свои значения. Например нужно написать функцию, но ограничение в один возвращаемый параметр нам не подходит (речь о функциях не для работы с листом). По легенде эта функция должна обрабатывать допустим массив данных:
Код
Function MyFunc(arr(), ByVal n as Integer) as Long
Dim a as Long, isum as Long
For a=LBound(arr,1) to Ubound(arr,1)
  isum=isum+arr(a, n):arr(a, n)=isum
Next
MyFunc = isum
End Function

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

П.С.: В общем все просто до безобразия.

 
Добрался наконец  :D
Anchoret, спасибо за объяснение — кажется, теперь я понял то, чего не понял тут. Всё приходит с опытом  :)
Изменено: Jack Famous - 11.05.2018 23:51:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх