Доярка
31-12-2011, 09:12
Всех с наступающим! Несмотря на то, что до Нового Года остаётся совсем мало времени, один вопрос не даёт мне покоя.
Как известно, в 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? Наподобие работают, например, ряд матричных функций (МУМНОЖ, МОБР), статистических (ТЕНДЕНЦИЯ, РОСТ) и др.
Как известно, в 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? Наподобие работают, например, ряд матричных функций (МУМНОЖ, МОБР), статистических (ТЕНДЕНЦИЯ, РОСТ) и др.