Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Пользов. функция, возвращающая массив / 21 сообщений из 21, страница 1 из 1
17.01.2007, 17:40
    #34262581
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
В одной из недавних тем (а именно здесь ) прозвучало авторитетное мнение:
White OwlДа не нужна ... функция вычисляющая массив. Такая фигня вообще никогда и никем не делается (ну кроме явных чайников)
У меня вопрос: какие противопоказания существуют для работы с функциями, возвращающими массив. И самое главное – почему не чайник (неявный чайник) не должен использовать такие функции?
...
Рейтинг: 0 / 0
17.01.2007, 18:13
    #34262719
Бабай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
2 lena_####
в вашей формулировке никаких. всякий может их использовать, если понимает зачем они нужны и как их использовать.

в той цитате, на которую вы ссылаетесь, подразумавались пользовательские функции, написанные на vba. На их использование тоже нет технических ограничений (кроме обычных технических ограничений эксель по работе с оперативной памятью).
Эстетические ограничения связаны с вписыванием таких функций в логику работы Ексель как плоского вычислителя, принципов разработки повторно-используемого кода для него с учетом рефакторинга.


Конкретно в том топике речь идет о функции, заполняющей область своего применения разносортной, разнотипно вычисленной информацией. Такая функция в себе инкапсулирует плоскую модель, которая в норме должна выражаться не кодом разработчика, а пользователем на листе. Функция такого сорта может стать абсолютно безполезной, как только пользователю захочется произвести изменения в разложении вычислительной модели своей программы на плоскость. Приведенный пример реализации - ад хок. Хорош только для данной задачи и выбранного стиля ее плоского оформления. Небольшие изменения в постановке задачи или перекомпоновки визуализации скорее всего приведут к выбрасыванию ее в корзину и полностью обесценят время, потраченное на ее разработку.

прошу пардонов. вроде как не я формулировал, не мне бы и отвечать. исключительно как комментарий к приводимому по ссылке примеру.

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

тако вот майо нескромное мнение по сему вопросу. как заслуженного чайника и ламера со стажем.
...
Рейтинг: 0 / 0
17.01.2007, 19:00
    #34262871
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Бабай, ты зачем так быстро отвечаешь? :)
Может в некоторых местах я бы по другому сформулировал, но по сути согласен со всем сказаным.
В той задаче которую решает Владимир Саныч, функции возвращающая массив возможна, но вредна, потому что она будет очень сильно завязана на здесь и сейчас. Могу только процитировать Бабая:
Небольшие изменения в постановке задачи или перекомпоновки визуализации скорее всего приведут к выбрасыванию ее в корзину и полностью обесценят время, потраченное на ее разработку.

А если говорить про функции создающую массив как тип данных и возвращающую его, мне почему-то кажется, что VBA такое не умеет вообще :)
...
Рейтинг: 0 / 0
17.01.2007, 23:47
    #34263192
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
White OwlА если говорить про функции создающую массив как тип данных и возвращающую его, мне почему-то кажется, что VBA такое не умеет вообще :)

От жеж!!! - все было так хорошо, так складно, пока последняя фраза не вырвалась :-)

Шаг 1: в стандартный модуль след. код

Код: plaintext
1.
2.
Function Test(ParamArray x() As Variant) As Variant
    Test = x
End Function

Шаг 2: в ячейку на листе след. формулу

=Test(1,2,3,4,5,6)

Шаг 3: в панели формул курсором выбираем формулу, жмем на F9 , и что мы видим?

={1,2,3,4,5,6}

Да и просто

Код: plaintext
1.
2.
3.
4.
5.
6.
Function Test() As Variant
    Dim x( 1  To  10 ) As Integer
    For i =  1  To  10 
        x(i) = i
    Next i
    Test = x
End Function

возвращает массив.

Али я чаго не понял?
...
Рейтинг: 0 / 0
18.01.2007, 02:23
    #34263285
Бабай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
наслоение романтикческое....

эхь. если б можно было б опечатков куда деть - записал бы себя в классики....

и што ето Лена_### меня не часто про ексель спрашивает?...

...фсё равно...

про ексель - никому ничего не скажу...

подпись:
Не меняя выражения лица.
...
Рейтинг: 0 / 0
18.01.2007, 10:46
    #34263841
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Да,
бабайЭстетические ограничения связаны с вписыванием таких функций в логику работы Ексель как плоского вычислителя, принципов разработки повторно-используемого кода для него с учетом рефакторинга.зе бест.

Тоже не меняя выражения лица.
...
Рейтинг: 0 / 0
18.01.2007, 18:22
    #34266156
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
KL (XL)возвращает массив.
Али я чаго не понял?Да не массив она у тебя возвращает, а Variant в который является массивом. Вызывающая процедура должна будет делать конвертацию из Variant в массив чтобы работать с результатом функции. Можно еще сделать пользовательский тип единственным элементом которого будет массив. Но это уже тоже не совсем массив.
Под возвращением массива из функции я имел в виду объявление функции так, чтобы сразу было видно что она вернет массив, а не неизвестно что как в случае с Variant.
...
Рейтинг: 0 / 0
18.01.2007, 18:38
    #34266219
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
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

вот только зачем так делать - говоря откровенно - я догадаться не могу.
...
Рейтинг: 0 / 0
18.01.2007, 19:59
    #34266390
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
VictoshaFunction MethodNum(ByVal a As Range, ByVal b As Range, Comment As Range) As String() О! А я и не знал что такой синтаксис возможен :)

Victoshaвот только зачем так делать - говоря откровенно - я догадаться не могу.Ну собственно говоря, с этого разговор и начался: оно можно, но не нужно.
...
Рейтинг: 0 / 0
21.01.2007, 11:48
    #34270373
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Спасибо большое всем, кто посчитал нужным откликнуться. Сейчас конечно поздно делать какие-либо уточнения (горячую фазу обсуждения я пропустила) но тем не менее: вопрос касался пользовательских функций рабочего листа , возвращающих массив.
Для себя я сделала следующий вывод:
целесообразность использования подобных функций в проекте (и, соответственно, их создание средствами VBA, что, очевидно, должно предшествовать их использованию) определяется исключительно логикой решаемой задачи. Во многих случаях (возможно, в большинстве из них) можно вполне обойтись без подобных экзерсисов. Но в некоторых конкретных случаях (например, в задаче, где требуется найти собственные векторы матрицы) использование подобной функции будет вполне оправдано, и замечательным образом будет вписано в
логику работы Ексель как плоского вычислителяне нарушая при этом
принципов разработки повторно-используемого кода для него с учетоми я не побоюсь этого слова
рефакторинга
...
Рейтинг: 0 / 0
13.02.2007, 15:22
    #34327444
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
а теперь о главном:
обнаружена информация о баге excel, который ставит под вопрос не только
пользовательские функции получающие на вход диапазоны данных,
но и вообще накладывает серьезные ограничения на использование excel как рабочей программы
для производства плоских вычислений.
баг касается версий 97, 2000, 2002
описание и демонстрация здесь
http://www.standards.com/OhMyExcel/ExcelBugsFeatures.html

в 2003 сп1 и 2007 пример по ссылке не демонстрирует наличия проблем.
в 2002 сп3 - проявляется в полный рост.

я, конечно не спец в екселе, поэтому право не знать имею....
но шокирующего впечатления это не отменяет.
...
Рейтинг: 0 / 0
13.02.2007, 17:44
    #34328026
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Victoshaобнаружена информация о баге excel,Это не баг, это неумение читать документацию.
Используя Variant для передачи области в процедуру, ты получаешь в процедуре область привязаную к активному листу, а не к тому листу на котором написана формула. При смене листа область автоматически "переедет" на лист ставший активным.
...
Рейтинг: 0 / 0
13.02.2007, 23:10
    #34328669
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
White Owl Victoshaобнаружена информация о баге excel,Это не баг, это неумение читать документацию.
Используя Variant для передачи области в процедуру, ты получаешь в процедуре область привязаную к активному листу, а не к тому листу на котором написана формула. При смене листа область автоматически "переедет" на лист ставший активным.
Сыч, ты бредишь.
...
Рейтинг: 0 / 0
14.02.2007, 00:56
    #34328732
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Victosha White Owl Victoshaобнаружена информация о баге excel,Это не баг, это неумение читать документацию.
Используя Variant для передачи области в процедуру, ты получаешь в процедуре область привязаную к активному листу, а не к тому листу на котором написана формула. При смене листа область автоматически "переедет" на лист ставший активным.
Сыч, ты бредишь.Во первых, не Сыч, а Сова. Во вторых, докажи что я не прав.

... а впрочем, я действительно был не совсем прав, виноват не вариантный параметр, а задание параметра в двойных скобках.
=somefunc(($A$1:$A$2))
Они и создают "прыгающую" по листам область. Какой лист в момент нажатия F9 был активным, ячейки того листа и будут использованы в расчете.
...
Рейтинг: 0 / 0
14.02.2007, 01:34
    #34328760
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Victosha ,

Этому багу без малого 100 лет - и его уже заобсуждали насмерть :-)

http://tinyurl.com/2ocmxc

В подтверждение наблюдений Совы... попробуй поменять функцию на это:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Function ProcessVariant(Optional vntArray As Range)
    Dim dblSum As Double
    Dim dblSumFunction As Double
    Dim vntItem As Range
    
    dblSumFunction = WorksheetFunction.Sum(vntArray)
    
    dblSum =  0 
    For Each vntItem In vntArray
        dblSum = dblSum + CDbl(vntItem)
    Next vntItem
    
    ProcessVariant = vntArray.Parent.Name
End Function


KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
14.02.2007, 02:46
    #34328789
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
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, например). Не больно то от этого весело.
Одно хорошо. То, что делать в экселе я ничего не делаю. Да и знать я его не знаю.
...
Рейтинг: 0 / 0
14.02.2007, 04:06
    #34328811
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
VictoshaНа использование многозонных диапазонов как входных параметров пользовательских функций он влияет определенно.бесспорно

VictoshaИ в топике о возможных проблемах, связанных написанием функций, возвращающих массивы, а значит почти наверно получающих на вход также наборы данных, считаю вполне уместным и даже необходимым. В этом топике это единственная содержательная информацияТут ты ошибаешься. Данная проблема не имеет никакого отношения к массивам и в принципе не способна повлиять на массив по одной простой причине - Excel просто не может превращать многозонные диапазоны в массив. Думаю, тебя ввел в заблуждение тот факт, что Howard (в силу непонимания или по рассеянности) использовал в названиях переменных слово Array. Его пример ни секунды не работает с массивами (Array), а лишь с диапазонами (Range) что далеко не одно и тоже, хотя отдельные их характеристики и сходны.

VictoshaА в том, на что влияет или не влияет способ определения формального параметра функции вы там с Совой меж собой как нибудь разбирайтесь. без меня.Тут на мой взгляд бредишь ты - я в подобной дискуссии участия не принимал.

VictoshaДля меня понятно следующее. Баг такого сорта скорее всего может (думаю, должен )иметь иные последствия и проявляться не только в пользовательских функциях, но и в прочем вба-коде, работающем с многозонными диапазонами.Я рад, что это тебе ясно. По несчастью, есть масса людей, придерживающихся другого мнения ;-) Проверено, иных последствий не имеет и возникает лишь в случае использования многозонных диапазонов как параметров UDF и в именованных формулах. Я же говорил - тему уже заобсуждали насмерть.

VictoshaЭто вообще ставит знак вопроса над вычислениями
вроде вычислений границ диапазонов, проведенных над страницами, не являющимися активными
страницами книги в момент вычислений. Все это уже мои домыслы....домыслы, к счастью, беспочвенные. На границы диапазонов данный баг никак не влияет, а только на значения из-за ошибки в определении листа содержащего многозонный диапазон.

VictoshaНо Worksheet.Activate так и тянется рука вставлять (на всякий Find, например). Ну во-первых это бесполезно, т.к. UDF вызванная из ячейки не может производить манипуляций с объектами (за редкими исключениями). Интересно, а почему рука не тянется проверять на наличие многозонных диапазонов в параметрах и выдавать ошибку - это то, что делают 99% родных функций в Excel.

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.06.2017, 15:48
    #39478536
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Сорри, что поднимаю старую тему.
Пытаюсь моделировать в Excel-е некий случайный процесс. Функция которая его обрабатывает, должна возвращать 3 значения, причем сразу, ибо
а) она считается небыстро
б) при следующем вызове расчет и аргументы могут поменяться (там генератор случайных чисел используется) и результаты будут неконсистентные. Собственно как вернуть массив понятно, а как его потом по ячейкам раскидать?
Давно с VBA не работал, забыл все. А может и не сталкивался.
...
Рейтинг: 0 / 0
27.06.2017, 16:04
    #39478549
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
См.
...
Рейтинг: 0 / 0
27.06.2017, 16:14
    #39478560
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Akina,
Огромное спасибо!
...
Рейтинг: 0 / 0
28.06.2017, 10:52
    #39478867
PlanB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Пользов. функция, возвращающая массив
Соколинский Борис,
а если вообще не париться, можно все запихать в одну ячейку как текст через разделитель (точка с запятой, например). а следующим шагом распарсить строку по разделителю =))
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Пользов. функция, возвращающая массив / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]