|
Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » Разное - Пользовательская функция в Excel с параметром – интервалом, можно ли так? |
|
Разное - Пользовательская функция в Excel с параметром – интервалом, можно ли так?
|
Новый участник Сообщения: 33 |
Профиль | Сайт | Отправить PM | Цитировать
Всех с наступающим! Несмотря на то, что до Нового Года остаётся совсем мало времени, один вопрос не даёт мне покоя.
Как известно, в Excel существует возможность создавать пользовательские функции на языке VBA, которые можно использовать в формулах рабочего листа. Если последний аргумент такой функции описать с ключевым словом ParamArray, то он может быть вызван сколь угодно много раз. Это с одной стороны хорошо, но с другой - иногда не совсем удобно. Например, пусть требуется из одного и того же заданного скаляра вычесть каждый элемент заданного интервала, и в итоге найти сумму квадратов этих разностей. Встроенная функция СУММКВРАЗН здесь не подойдёт, поскольку она работает лишь для двух интервалов одинаковых размеров. Самый простой способ: построить такой же интервал, что приводит к ненужному разбазариванию ячеек листа, в которых хранятся лишь промежуточные значения, ненужные при получении конечного результата. Ладно, если исходный интервал имеет малые размеры, а если достаточно большие? Если пожелаете открыть прилагаемый файл Excel формата 2003, то предварительно в параметрах безопасности макросов необходимо выбрать режим: в 2003 «Безопасность - Средняя», а в 2007 «Отключить все макросы с уведомлением». При открытии содержащийся макрос необходимо включить. Первый способ, вручную без макроса: пусть интервал расположен в A2:D4 (т.е. размеры 4*3), скаляр в F2. Тогда в H2 пишу формулу =($F$2-A2)^2 и заполняю ей интервал тоже размеров 4*3, т.е. H2:K4. И наконец в I6 пишу формулу =СУММ(H2:K4) где и размещён ответ. Другой способ: в редакторе VBA создаю в текущем файле новый модуль, в него вставляю вот такую функцию: Function SUMSQ(Scalar, ParamArray Interval())Тогда в I8 вставляю эту функцию из категории «Определённые пользователем» (аж с 13 аргументами!), получается весьма громоздкая формула: =SUMSQ(F2;A2;B2;C2;D2;A3;B3;C3;D3;A4;B4;C4;D4) Результаты, конечно, совпали. Но... формула напоминает небезызвестный анекдот про автора опуса «Индеец Джо едет на коне» (много страниц из фраз «цок-цок-цок...») Что хотелось бы: как-нибудь изменить эту функцию так, чтобы первый аргумент по-прежнему содержал ссылку на скаляр, а второй и последний – сразу ссылку на весь интервал! Например, =ИМЯ_ФУНКЦИИ(F2;A2:D4) Перелопачено много документации, но как это сделать, увы, не знаю... И ещё вопрос. Если такая возможность всё же имеется, можно ли сделать так, чтобы функция (конечно, какая-нибудь другая) возвращала бы массив? Т.е. при вводе формулы с функцией в единичную ячейку отображался бы первый элемент массива, а потом выделяется нужный интервал для массива, нажимается F2 и затем Ctrl+Shift+Enter? Наподобие работают, например, ряд матричных функций (МУМНОЖ, МОБР), статистических (ТЕНДЕНЦИЯ, РОСТ) и др. |
|
Отправлено: 09:12, 31-12-2011 |
Новый участник Сообщения: 33
|
Профиль | Сайт | Отправить PM | Цитировать Проблема одна и та же. Чтобы пользовательская функция могла полноценно работать с аргументом, описанным как массив. Ну и в идеале сама выдавала бы массив.
|
Отправлено: 13:00, 02-01-2012 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Модератор Сообщения: 16848
|
Профиль | Сайт | Отправить PM | Цитировать Функция, вычисляющая сумму элементов строки, указанной в ячейке С11 матрицы [A2:D4]
=СУММ(ИНДЕКС(A2:D4;C11;0)) 5 вариантов пользовательских функций: Спасибо коллегам PlanetaExcel |
------- Последний раз редактировалось okshef, 02-01-2012 в 19:16. Отправлено: 18:26, 02-01-2012 | #12 |
Новый участник Сообщения: 33
|
Профиль | Сайт | Отправить PM | Цитировать Спасибо огромное!!! Ваши коллеги – настоящие спецы! Разбираться буду позже, сейчас ухожу по делам.
Ну и теперь (строго в рамках темы – в ней вопрос уже был задан!) как бы соорудить такую пользовательскую функцию, которая выводила бы массив, состоящий из всей строки (номер строки указан в аргументе) матрицы? Т.е. для полноценной вставки функции выделялся бы интервал и нажималось бы Ctrl+Shift+Enter? |
Отправлено: 02:17, 03-01-2012 | #13 |
Модератор Сообщения: 16848
|
Профиль | Сайт | Отправить PM | Цитировать Доярка, более чем странный вопрос, тем более вы сами это делаете:
В первую ячейку введите формулу =ИНДЕКС(массив;ячейка_с_номером_строки;СТОЛБЕЦ(A1)) и протягиваете ее столько, сколько нужно. Соответственно, в третей ячейке получится =ИНДЕКС(массив;ячейка_с_номером_строки;СТОЛБЕЦ(C1)) ВводИте как угодно, хоть формулой массива, хоть простой. |
------- Отправлено: 09:31, 03-01-2012 | #14 |
Новый участник Сообщения: 33
|
Профиль | Сайт | Отправить PM | Цитировать Я Вас понимаю в том отношении, что многие поставленные задачи могут быть успешно решены с помощью формул рабочего листа. Многие, но не все же – для этого и существует язык VBA.
Хорошо, возьмём такую задачу. Пусть на рабочем листе расположена матрица размером m*n. Требуется найти все коэффициенты попарной корреляции её столбцов. Всего таких коэффициентов должно быть n*(n-1)/2. В прилагаемом заархивированном файле «Correlation.xlsm» приводится её решение двумя способами: тупо с помощью формул, и через макрос CorrelationCoeffs. Хорошо, что может измениться: - размеры исходной матрицы; - расположение исходной матрицы; - расположение строки и, в которую заносятся результаты расчётов, и её начальной ячейки. И что, в таком случае каждый раз менять код с указанием этих параметров? Хотелось бы, чтобы поставленную задачу решала уже функция с единственным аргументом – исходной матрицей, и пусть по умолчанию ряды данных располагаются в столбцах. И выводила бы она уже массив из n*(n-1)/2 элементов. При вставке такой функции как скаляра выводилось бы первое значение массива, а при выделении в строке диапазона нужной длины - все его элементы отображались бы при нажатии Ctrl+Shift+Enter. Вот и интересуюсь, как бы это сделать? Конечно, размеры выделения определял бы сам пользователь – точно так же, как при использовании встроенных функций, возвращающих матрицы. |
Отправлено: 08:11, 05-01-2012 | #15 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
есть ли в php аналог функции XIRR? (XIRR-функция Excel) | zvezda_t | Вебмастеру | 2 | 25-02-2010 02:55 | |
Разное - Запустить 3D Mark с определённым параметром. Можно такое? | yurfed | Программирование и базы данных | 2 | 01-10-2008 10:34 | |
Можно ли так поступить? | sirius_99 | Microsoft Windows NT/2000/2003 | 3 | 10-07-2007 15:12 | |
Можно ли сделать так... | starav | Microsoft Windows NT/2000/2003 | 7 | 12-04-2005 09:45 | |
Можно ли так. | Denhell | Вебмастеру | 9 | 10-03-2005 20:24 |
|