Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » Разное - Пользовательская функция в Excel с параметром – интервалом, можно ли так?

Ответить
Настройки темы
Разное - Пользовательская функция в Excel с параметром – интервалом, можно ли так?

Аватара для Доярка

Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: xls DemoFunction.xls
(32.0 Kb, 5 просмотров)
Всех с наступающим! Несмотря на то, что до Нового Года остаётся совсем мало времени, один вопрос не даёт мне покоя.
Как известно, в 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())
SUMSQ = 0
For i = LBound(Interval) To UBound(Interval)
SUMSQ = SUMSQ + (Scalar - Interval(i)) ^ 2
Next i
End Function
Тогда в 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
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: xls DemoFunction.xls
(36.0 Kb, 14 просмотров)

Проблема одна и та же. Чтобы пользовательская функция могла полноценно работать с аргументом, описанным как массив. Ну и в идеале сама выдавала бы массив.

Отправлено: 13:00, 02-01-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Модератор


Moderator


Сообщения: 16831
Благодарности: 3245

Профиль | Сайт | Отправить PM | Цитировать


Функция, вычисляющая сумму элементов строки, указанной в ячейке С11 матрицы [A2:D4]
=СУММ(ИНДЕКС(A2:D4;C11;0))

5 вариантов пользовательских функций:
читать дальше »
Код: Выделить весь код
Function SumRow(arr As Range, nRow As Long) As Double
    SumRow = Application.Sum(Application.Index(arr, nRow, 0))
End Function
----------------------
Function SumRow1(arr As Range, nRow As Long) As Double
    SumRow1 = Application.Sum(arr.Rows(nRow))
End Function
----------------------
Function SumRow2(arr As Range, nRow As Long) As Double
Dim a As Variant, s As Double, i As Long
a = arr.Value
    For i = 1 To UBound(a, 2)
        s = s + a(nRow, i)
    Next i
SumRow2 = s
End Function
---------------------
Function SumRow3(arr As Range, nRow As Long) As Double
Dim a As Variant, s As Double
    For Each a In arr.Rows(nRow).Value
        s = s + a
    Next 'a
SumRow3 = s
End Function
----------------------
Function SumRow4(arr As Range, nRow As Long) As Double
Dim a As Variant
    For Each a In arr.Rows(nRow).Value
        If IsNumeric(a) Then SumRow4 = SumRow4 + a
    Next a
End Function

Спасибо коллегам PlanetaExcel

-------
При заполнении сведений о конфигурации компьютера не забудь поставить флажок: отображать - "Да"
-------------------------------------------------------------------------------------------
Ассоциация VirusNet - помощь и обучение борьбе с вирусами. Некоторые вопросы загрузки в моем блоге


Последний раз редактировалось okshef, 02-01-2012 в 19:16.


Отправлено: 18:26, 02-01-2012 | #12


Аватара для Доярка

Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Спасибо огромное!!! Ваши коллеги – настоящие спецы! Разбираться буду позже, сейчас ухожу по делам.
Ну и теперь (строго в рамках темы – в ней вопрос уже был задан!) как бы соорудить такую пользовательскую функцию, которая выводила бы массив, состоящий из всей строки (номер строки указан в аргументе) матрицы? Т.е. для полноценной вставки функции выделялся бы интервал и нажималось бы Ctrl+Shift+Enter?

Отправлено: 02:17, 03-01-2012 | #13


Модератор


Moderator


Сообщения: 16831
Благодарности: 3245

Профиль | Сайт | Отправить PM | Цитировать


Доярка, более чем странный вопрос, тем более вы сами это делаете:
В первую ячейку введите формулу

=ИНДЕКС(массив;ячейка_с_номером_строки;СТОЛБЕЦ(A1))

и протягиваете ее столько, сколько нужно.
Соответственно, в третей ячейке получится

=ИНДЕКС(массив;ячейка_с_номером_строки;СТОЛБЕЦ(C1))

ВводИте как угодно, хоть формулой массива, хоть простой.

-------
При заполнении сведений о конфигурации компьютера не забудь поставить флажок: отображать - "Да"
-------------------------------------------------------------------------------------------
Ассоциация VirusNet - помощь и обучение борьбе с вирусами. Некоторые вопросы загрузки в моем блоге


Отправлено: 09:31, 03-01-2012 | #14


Аватара для Доярка

Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip Correlation.zip
(12.9 Kb, 10 просмотров)

Я Вас понимаю в том отношении, что многие поставленные задачи могут быть успешно решены с помощью формул рабочего листа. Многие, но не все же – для этого и существует язык VBA.
Хорошо, возьмём такую задачу. Пусть на рабочем листе расположена матрица размером m*n. Требуется найти все коэффициенты попарной корреляции её столбцов. Всего таких коэффициентов должно быть n*(n-1)/2.
В прилагаемом заархивированном файле «Correlation.xlsm» приводится её решение двумя способами: тупо с помощью формул, и через макрос CorrelationCoeffs. Хорошо, что может измениться:
- размеры исходной матрицы;
- расположение исходной матрицы;
- расположение строки и, в которую заносятся результаты расчётов, и её начальной ячейки.
И что, в таком случае каждый раз менять код с указанием этих параметров?
Хотелось бы, чтобы поставленную задачу решала уже функция с единственным аргументом – исходной матрицей, и пусть по умолчанию ряды данных располагаются в столбцах. И выводила бы она уже массив из n*(n-1)/2 элементов. При вставке такой функции как скаляра выводилось бы первое значение массива, а при выделении в строке диапазона нужной длины - все его элементы отображались бы при нажатии Ctrl+Shift+Enter. Вот и интересуюсь, как бы это сделать? Конечно, размеры выделения определял бы сам пользователь – точно так же, как при использовании встроенных функций, возвращающих матрицы.

Отправлено: 08:11, 05-01-2012 | #15



Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » Разное - Пользовательская функция в Excel с параметром – интервалом, можно ли так?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
есть ли в 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




 
Переход