|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
В одной из недавних тем (а именно здесь ) прозвучало авторитетное мнение: White OwlДа не нужна ... функция вычисляющая массив. Такая фигня вообще никогда и никем не делается (ну кроме явных чайников) У меня вопрос: какие противопоказания существуют для работы с функциями, возвращающими массив. И самое главное – почему не чайник (неявный чайник) не должен использовать такие функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2007, 17:40 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
2 lena_#### в вашей формулировке никаких. всякий может их использовать, если понимает зачем они нужны и как их использовать. в той цитате, на которую вы ссылаетесь, подразумавались пользовательские функции, написанные на vba. На их использование тоже нет технических ограничений (кроме обычных технических ограничений эксель по работе с оперативной памятью). Эстетические ограничения связаны с вписыванием таких функций в логику работы Ексель как плоского вычислителя, принципов разработки повторно-используемого кода для него с учетом рефакторинга. Конкретно в том топике речь идет о функции, заполняющей область своего применения разносортной, разнотипно вычисленной информацией. Такая функция в себе инкапсулирует плоскую модель, которая в норме должна выражаться не кодом разработчика, а пользователем на листе. Функция такого сорта может стать абсолютно безполезной, как только пользователю захочется произвести изменения в разложении вычислительной модели своей программы на плоскость. Приведенный пример реализации - ад хок. Хорош только для данной задачи и выбранного стиля ее плоского оформления. Небольшие изменения в постановке задачи или перекомпоновки визуализации скорее всего приведут к выбрасыванию ее в корзину и полностью обесценят время, потраченное на ее разработку. прошу пардонов. вроде как не я формулировал, не мне бы и отвечать. исключительно как комментарий к приводимому по ссылке примеру. Есть еще один момент. Если функция не должна и не будет служить, как одноклеточная функция массива (вроде суммы матрицы), то, скорее всего, без неё можно обойтись. Такую писать не обязательно, а собравшись повзвешивать полюсы и минусы альтернативных реализаций. Если функция может и будет использоваться как одноклеточная , то написать ее необходимо немедленно после того, как достигается понимание, что ее умений нельзя (или неразумно сложно) достичь набором стандартных функций. В специальных случаях, вроде того, что вашей ссылке, проектировщик должен знать, что он с этим будет делать, когда наступит потом. тако вот майо нескромное мнение по сему вопросу. как заслуженного чайника и ламера со стажем. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2007, 18:13 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Бабай, ты зачем так быстро отвечаешь? :) Может в некоторых местах я бы по другому сформулировал, но по сути согласен со всем сказаным. В той задаче которую решает Владимир Саныч, функции возвращающая массив возможна, но вредна, потому что она будет очень сильно завязана на здесь и сейчас. Могу только процитировать Бабая: Небольшие изменения в постановке задачи или перекомпоновки визуализации скорее всего приведут к выбрасыванию ее в корзину и полностью обесценят время, потраченное на ее разработку. А если говорить про функции создающую массив как тип данных и возвращающую его, мне почему-то кажется, что VBA такое не умеет вообще :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2007, 19:00 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
White OwlА если говорить про функции создающую массив как тип данных и возвращающую его, мне почему-то кажется, что VBA такое не умеет вообще :) От жеж!!! - все было так хорошо, так складно, пока последняя фраза не вырвалась :-) Шаг 1: в стандартный модуль след. код Код: plaintext 1. 2.
Шаг 2: в ячейку на листе след. формулу =Test(1,2,3,4,5,6) Шаг 3: в панели формул курсором выбираем формулу, жмем на F9 , и что мы видим? ={1,2,3,4,5,6} Да и просто Код: plaintext 1. 2. 3. 4. 5. 6.
возвращает массив. Али я чаго не понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2007, 23:47 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
наслоение романтикческое.... эхь. если б можно было б опечатков куда деть - записал бы себя в классики.... и што ето Лена_### меня не часто про ексель спрашивает?... ...фсё равно... про ексель - никому ничего не скажу... подпись: Не меняя выражения лица. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2007, 02:23 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Да, бабайЭстетические ограничения связаны с вписыванием таких функций в логику работы Ексель как плоского вычислителя, принципов разработки повторно-используемого кода для него с учетом рефакторинга.зе бест. Тоже не меняя выражения лица. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2007, 10:46 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
KL (XL)возвращает массив. Али я чаго не понял?Да не массив она у тебя возвращает, а Variant в который является массивом. Вызывающая процедура должна будет делать конвертацию из Variant в массив чтобы работать с результатом функции. Можно еще сделать пользовательский тип единственным элементом которого будет массив. Но это уже тоже не совсем массив. Под возвращением массива из функции я имел в виду объявление функции так, чтобы сразу было видно что она вернет массив, а не неизвестно что как в случае с Variant. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2007, 18:22 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
White Owl[quot KL (XL)]... Под возвращением массива из функции я имел в виду объявление функции так, чтобы сразу было видно что она вернет массив, а не неизвестно что как в случае с Variant. это можно сделать, если версия вба способна поддержать, функцию, возвращающую массив. обхявите свою функцию как Function MethodNum(ByVal a As Range, ByVal b As Range, Comment As Range) As String() и сделайте совместимое по типу объявление возвращаемого массива ReDim retArr(IcallerRows% - 1, 1) As String '- 1) на выходе присвойте значение: MethodNum=retArr вот только зачем так делать - говоря откровенно - я догадаться не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2007, 18:38 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
VictoshaFunction MethodNum(ByVal a As Range, ByVal b As Range, Comment As Range) As String() О! А я и не знал что такой синтаксис возможен :) Victoshaвот только зачем так делать - говоря откровенно - я догадаться не могу.Ну собственно говоря, с этого разговор и начался: оно можно, но не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2007, 19:59 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Спасибо большое всем, кто посчитал нужным откликнуться. Сейчас конечно поздно делать какие-либо уточнения (горячую фазу обсуждения я пропустила) но тем не менее: вопрос касался пользовательских функций рабочего листа , возвращающих массив. Для себя я сделала следующий вывод: целесообразность использования подобных функций в проекте (и, соответственно, их создание средствами VBA, что, очевидно, должно предшествовать их использованию) определяется исключительно логикой решаемой задачи. Во многих случаях (возможно, в большинстве из них) можно вполне обойтись без подобных экзерсисов. Но в некоторых конкретных случаях (например, в задаче, где требуется найти собственные векторы матрицы) использование подобной функции будет вполне оправдано, и замечательным образом будет вписано в логику работы Ексель как плоского вычислителяне нарушая при этом принципов разработки повторно-используемого кода для него с учетоми я не побоюсь этого слова рефакторинга ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2007, 11:48 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
а теперь о главном: обнаружена информация о баге excel, который ставит под вопрос не только пользовательские функции получающие на вход диапазоны данных, но и вообще накладывает серьезные ограничения на использование excel как рабочей программы для производства плоских вычислений. баг касается версий 97, 2000, 2002 описание и демонстрация здесь http://www.standards.com/OhMyExcel/ExcelBugsFeatures.html в 2003 сп1 и 2007 пример по ссылке не демонстрирует наличия проблем. в 2002 сп3 - проявляется в полный рост. я, конечно не спец в екселе, поэтому право не знать имею.... но шокирующего впечатления это не отменяет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2007, 15:22 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Victoshaобнаружена информация о баге excel,Это не баг, это неумение читать документацию. Используя Variant для передачи области в процедуру, ты получаешь в процедуре область привязаную к активному листу, а не к тому листу на котором написана формула. При смене листа область автоматически "переедет" на лист ставший активным. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2007, 17:44 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
White Owl Victoshaобнаружена информация о баге excel,Это не баг, это неумение читать документацию. Используя Variant для передачи области в процедуру, ты получаешь в процедуре область привязаную к активному листу, а не к тому листу на котором написана формула. При смене листа область автоматически "переедет" на лист ставший активным. Сыч, ты бредишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2007, 23:10 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Victosha White Owl Victoshaобнаружена информация о баге excel,Это не баг, это неумение читать документацию. Используя Variant для передачи области в процедуру, ты получаешь в процедуре область привязаную к активному листу, а не к тому листу на котором написана формула. При смене листа область автоматически "переедет" на лист ставший активным. Сыч, ты бредишь.Во первых, не Сыч, а Сова. Во вторых, докажи что я не прав. ... а впрочем, я действительно был не совсем прав, виноват не вариантный параметр, а задание параметра в двойных скобках. =somefunc(($A$1:$A$2)) Они и создают "прыгающую" по листам область. Какой лист в момент нажатия F9 был активным, ячейки того листа и будут использованы в расчете. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2007, 00:56 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Victosha , Этому багу без малого 100 лет - и его уже заобсуждали насмерть :-) http://tinyurl.com/2ocmxc В подтверждение наблюдений Совы... попробуй поменять функцию на это: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
KL [MVP - Microsoft Excel] ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2007, 01:34 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
White Owl ... а впрочем, я действительно был не совсем прав, виноват не вариантный параметр, а задание параметра в двойных скобках. =somefunc(($A$1:$A$2)) Они и создают "прыгающую" по листам область. Какой лист в момент нажатия F9 был активным, ячейки того листа и будут использованы в расчете. дело не в скобках самих по себе. именно в таком случае: =somefunc(($A$1:$A$2)) НИКАКОЙ ошибки не будет. Несмотря на скобки (которые по документации не прыгающую область создают, а определяют способ формирования многозонного диапазона для передачи его функции как единого параметра), здесь передается диапазон, состоящий из единственной области. Так вот в случае, если задать входной диапазон состоящим из двух (или более), даже смежных, областей, то баг проявится в тех версиях, которые ему подвержены. Задайте =somefunc(($A$1:$A$2;$B$1:$B$2)) сдесь две (фактически смежных) области передаются как один составной диапазоне. внутренние скобки определяют операцию группирования двух поддиапазонов в один. Этого достаточно, чтобы вычисления сломались при их выполнении не с того листа. Это =somefunc(($A$1:$B$2)) - работает по человечески независимо от наличия или отсутствия внутренних скобок. а это =somefunc(($A$1;$A$2;$B$1;$B$2)) - не работает правильно независимо от способа разбиения (по факту даже сплошного) диапазона на количество частей. ($A$1:$A$2;$B$1:$B$2) ($A$1:$B$2;$B$1;$B$2) ($A$1;$A$2;$B$1;$B$2) любой из этих вариантов будет давать ошибку в екселях 97-2002. Независимо от того, как определен формальный параметр в пользовательской функции. Как Range или как Variant - багу это фиолетово. (По крайней мере под ексель 2002.) ------------ 2 KL (XL) я рад за баг, за то, что ему сто лет. И сожалею только о том, что я был последний, кто узнал о его существовании. На использование многозонных диапазонов как входных параметров пользовательских функций он влияет определенно. И в топике о возможных проблемах, связанных написанием функций, возвращающих массивы, а значит почти наверно получающих на вход также наборы данных, считаю вполне уместным и даже необходимым. В этом топике это единственная содержательная информация. А в том, на что влияет или не влияет способ определения формального параметра функции вы там с Совой меж собой как нибудь разбирайтесь. без меня. Для меня понятно следующее. Баг такого сорта скорее всего может (думаю, должен )иметь иные последствия и проявляться не только в пользовательских функциях, но и в прочем вба-коде, работающем с многозонными диапазонами. Это вообще ставит знак вопроса над вычислениями вроде вычислений границ диапазонов, проведенных над страницами, не являющимися активными страницами книги в момент вычислений. Все это уже мои домыслы. Но Worksheet.Activate так и тянется рука вставлять (на всякий Find, например). Не больно то от этого весело. Одно хорошо. То, что делать в экселе я ничего не делаю. Да и знать я его не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2007, 02:46 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
VictoshaНа использование многозонных диапазонов как входных параметров пользовательских функций он влияет определенно.бесспорно VictoshaИ в топике о возможных проблемах, связанных написанием функций, возвращающих массивы, а значит почти наверно получающих на вход также наборы данных, считаю вполне уместным и даже необходимым. В этом топике это единственная содержательная информацияТут ты ошибаешься. Данная проблема не имеет никакого отношения к массивам и в принципе не способна повлиять на массив по одной простой причине - Excel просто не может превращать многозонные диапазоны в массив. Думаю, тебя ввел в заблуждение тот факт, что Howard (в силу непонимания или по рассеянности) использовал в названиях переменных слово Array. Его пример ни секунды не работает с массивами (Array), а лишь с диапазонами (Range) что далеко не одно и тоже, хотя отдельные их характеристики и сходны. VictoshaА в том, на что влияет или не влияет способ определения формального параметра функции вы там с Совой меж собой как нибудь разбирайтесь. без меня.Тут на мой взгляд бредишь ты - я в подобной дискуссии участия не принимал. VictoshaДля меня понятно следующее. Баг такого сорта скорее всего может (думаю, должен )иметь иные последствия и проявляться не только в пользовательских функциях, но и в прочем вба-коде, работающем с многозонными диапазонами.Я рад, что это тебе ясно. По несчастью, есть масса людей, придерживающихся другого мнения ;-) Проверено, иных последствий не имеет и возникает лишь в случае использования многозонных диапазонов как параметров UDF и в именованных формулах. Я же говорил - тему уже заобсуждали насмерть. VictoshaЭто вообще ставит знак вопроса над вычислениями вроде вычислений границ диапазонов, проведенных над страницами, не являющимися активными страницами книги в момент вычислений. Все это уже мои домыслы....домыслы, к счастью, беспочвенные. На границы диапазонов данный баг никак не влияет, а только на значения из-за ошибки в определении листа содержащего многозонный диапазон. VictoshaНо Worksheet.Activate так и тянется рука вставлять (на всякий Find, например). Ну во-первых это бесполезно, т.к. UDF вызванная из ячейки не может производить манипуляций с объектами (за редкими исключениями). Интересно, а почему рука не тянется проверять на наличие многозонных диапазонов в параметрах и выдавать ошибку - это то, что делают 99% родных функций в Excel. KL [MVP - Microsoft Excel] ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2007, 04:06 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Сорри, что поднимаю старую тему. Пытаюсь моделировать в Excel-е некий случайный процесс. Функция которая его обрабатывает, должна возвращать 3 значения, причем сразу, ибо а) она считается небыстро б) при следующем вызове расчет и аргументы могут поменяться (там генератор случайных чисел используется) и результаты будут неконсистентные. Собственно как вернуть массив понятно, а как его потом по ячейкам раскидать? Давно с VBA не работал, забыл все. А может и не сталкивался. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2017, 15:48 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
См. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2017, 16:04 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Akina, Огромное спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2017, 16:14 |
|
Excel. Пользов. функция, возвращающая массив
|
|||
---|---|---|---|
#18+
Соколинский Борис, а если вообще не париться, можно все запихать в одну ячейку как текст через разделитель (точка с запятой, например). а следующим шагом распарсить строку по разделителю =)) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2017, 10:52 |
|
|
start [/forum/topic.php?fid=61&msg=34328760&tid=2172641]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 147ms |
0 / 0 |