Страницы: 1
RSS
Массив с нарастающим итогом.
 
Немного корявое название, извиняюсь. Интересует решение именно формулами.  
В идеале хотелось бы эм.. получать элементы массива путём тех или иных манипуляций с увеличивающимся тем или иным образом диапазоном. Ключевая часть-увеличивающийся диапазон.  
К примеру, вчера была задача, где требовалось получать значения нарастающим итогом, т е из данных столбца A получить данные столбца B:  
A1=1 B1=Сумм($A$1:A1)=1  
A2=2 B2=Сумм($A$1:A2)=3  
A3=3 B3=Сумм($A$1:A3)=6  
A4=4 B4=Сумм($A$1:A4)=10  
A5=5 B5=Сумм($A$1:A5)=15  
А хотелось получить массив из данных столбца B без создания, собственно, столбца B.  
Т е, в данном случае, нечто вроде:  
СУММ(A2:ИНДЕКС(A2:A6;СТРОКА(A1:A5))) или СУММ(A2:ДВССЫЛ("a"&СТРОКА(A2:A6)))  
Однако excel все варианты моих извращений такого плана за массив не воспринимает и упорно выдает только первое значение.  
 
И, если решение напрямую невозможно, есть ли какие-нибудь решения "через одно место", имеющие более-менее приемлемый вид?  
PS: в качестве решения "через одно место" так же пытался сделать массив, значения которых создаются из одних и тех же диапазонов, но, при расчёте элементов, ненужные части, разные для каждого из элементов, "отбрасываются" в зависимости от строки. Практически не получилось, т к не смог указать экселю проверять именно по элементам, а не по диапазонам, по которым расчитывается каждый элемент массива. Был сонный, может просто руки кривые. Это как идея...  
 
Заранее спасибо.
 
Я вчера тоже пробовал без доп. столбцов, через СМЕЩ, тоже не получилось:  
=СУММ(ЕСЛИ(B2>СУММ(СМЕЩ($C$2;;;СТРОКА($1:$15);1));1;0))
 
=МУМНОЖ(ЕСЛИ(СТРОКА(A1:I9)>=СТОЛБЕЦ(A1:I9);1;0);J2:J10)  
для приведённого примера  
=МУМНОЖ(ЕСЛИ(СТРОКА(A1:E5)>=СТОЛБЕЦ(A1:E5);1;0);A1:A5)
 
Почему не работает СУММ(СМЕЩ($C$2;;;СТРОКА($1:$15);1)) в приведенной формуле?
 
{quote}{login=vikttur}{date=13.08.2009 09:25}{thema=}{post}Почему не работает СУММ(СМЕЩ($C$2;;;СТРОКА($1:$15);1)) в приведенной формуле?{/post}{/quote}  
 
это вопрос к KL,    
я в своё время создавал целую ветку с тем же вопросом, но увы ответа не получил....
 
Так?  
 
=ПРОМЕЖУТОЧНЫЕ.ИТОГИ(9;СМЕЩ(A1;;;СТРОКА(A1:A15);))  
 
=СУММЕСЛИ(СМЕЩ(A1;;;СТРОКА(A1:A15););"<>")
KL
 
Работает. Почему ЕСЛИ "<>"?
 
{quote}{login=vikttur}{date=13.08.2009 09:25}{thema=}{post}Почему не работает СУММ(СМЕЩ($C$2;;;СТРОКА($1:$15);1)) в приведенной формуле?{/post}{/quote}  
 
Думаю, ответ сравнительно простой: СУММ не умеет работать с массивами диапазонов, чего не скажешь о СУММЕСЛИ, СЧЁТЕСЛИ или ПРОМЕЖУТОЧНЫЕ.ИТОГИ  
 
СУММ в данном случае видит лишь первый диапазон, т.е. 1  
 
А почему так, вопрос скорее к разработчикам Excel :-)
KL
 
{quote}{login=vikttur}{date=13.08.2009 10:48}{thema=}{post}Работает. Почему ЕСЛИ "<>"?{/post}{/quote}  
 
Ну какое-то условие надо было поставить обязательно, вот я и подумал, что неравенство "" (строке нулевой длинны) - самое безобидное :-)
KL
 
{quote}{login=KL}{date=13.08.2009 10:54}{thema=Re: }{post}{quote}{login=vikttur}{date=13.08.2009 09:25}{thema=}{post}Почему не работает СУММ(СМЕЩ($C$2;;;СТРОКА($1:$15);1)) в приведенной формуле?{/post}{/quote}СУММ не умеет работать с массивами диапазонов, чего не скажешь о СУММЕСЛИ, СЧЁТЕСЛИ или ПРОМЕЖУТОЧНЫЕ.ИТОГИ{/post}{/quote}  
То же относится и к формулам автора темы (Саша, извините за перехват инициативы).  
Очередной ликбез закончен. Спасибо за науку.
 
Нарастающий диапазон можно еще получить так ДВССЫЛ("A1:A"&СТРОКА(A1:A15))  
 
Что обидно это то, что обе функции позволяющие это сделать СМЕЩ и ДВССЫЛ - летучии. А та самая третья нелетучая - ИНДЕКС - этого не делает и массив диапазонов практически не возвращает (исключение - ввод формулы массива в несколько ячеек одновременно, например {=ИНДЕКС(A1:A15;СТРОКА(1:15))} одновременно в B1:B15)
KL
 
Кстати, забыл добавить(не знаю, есть ли у этого практическое применение): для того, чтобы функция СУММ могла работать хотябы с первыми значениями массива диапазонов, их нужно конвертировать в массивы значений. Например:  
 
=СУММ(Ч(ДВССЫЛ({"A2:C1";"A6";"A10:G11"})))  
 
В данном случае суммируются значения ячеек A2, A6, A10
KL
 
Кто-то из великих изрек : "Чем больше зню, тем меньше знаю" :)
 
Vikttur, да не за что извиняться, конечно же...  
 
Я только успел ради спортивного интереса сделать решение той задачи с помощью первой формулы, пару раз наступив на грабли, получив следующего монстра:  
=ЕСЛИ(B2<>"";ИНДЕКС($A$2:$A$16;ПОИСКПОЗ(ИСТИНА;СУММ($B$2:B2)<=МУМНОЖ(ЕСЛИ(СТРОКА($A$1:ИНДЕКС($1:$65536;СТРОКА($C$16)-СТРОКА($C$2)+1;1))>=СТОЛБЕЦ($A$1:ИНДЕКС($1:$65536;1;СТРОКА($C$16)-СТРОКА($C$2)+1));1;0);ЕСЛИ($C$2:$C$16="";0;$C$2:$C$16));0))-A2;"")  
Всё таки крайне неудобная для данной задачи функция, т к обязательно нужна проверка на числа и "квадратные массивы" и иже с ними. Но даже это было, так сказать, счастьем.  
 
А тут такие подарки..  
=ЕСЛИ(B2<>"";ИНДЕКС($A$2:$A$16;ПОИСКПОЗ(ИСТИНА;СУММ($B$2:B2)<=СУММЕСЛИ(СМЕЩ($C$2;;;СТРОКА($A$1:$A$15););"<>");0))-A2;"")  
Небо и земля, как говорится.  
 
KL, спасибо большое.  
 
...  
"продолжает экспериментировать"  
Возник вопрос:  
Пытаюсь написать функции для разных вариантов строк "не подряд". К примеру, только значения из строк, кратным трём.    
Тут смещение не подходит, т к проверка, если её вносить в аргумент высота, будет "одна для всех" по "крайней" ячейке, так? Или как то по иному можно сделать проверку?  
Есть смутное подозрение, что это можно сделать через двссыл, но, опять же, как?....можешь подсказать пожалуйста как это легче реализовать?  
 
PS: мозг по-тихоньку умирает и в голове крутится пугающая полу сформулированная мысль "трёхмерный массив".
 
Последнее сообщение моё.  
Извиняюсь, что так сумбурно написано.
 
Вроде как получилось.  
Черновой вариант-пример:  
=СУММ(СУММЕСЛИ(ДВССЫЛ(ЕСЛИ(СТРОКА(A1:A15)/3=ОКРУГЛВНИЗ(СТРОКА(A1:A15)/3;0);"a"&СТРОКА(1:15);"a1"));"<>"))  
Ещё раз спасибо.
 
{quote}{login=KL}{date=13.08.2009 11:29}{thema=}{post}Кстати, забыл добавить(не знаю, есть ли у этого практическое применение): для того, чтобы функция СУММ могла работать хотябы с первыми значениями массива диапазонов, их нужно конвертировать в массивы значений. Например:  
 
=СУММ(Ч(ДВССЫЛ({"A2:C1";"A6";"A10:G11"})))  
 
В данном случае суммируются значения ячеек A2, A6, A10{/post}{/quote}  
 
Дело в том что  
=СУММ(ДВССЫЛ({"A2:C1";"A6";"A10:G11"}))  
на самом деле возвращает массив сумм перичисленных диапазонов.  
Вывести эти суммы как массив можно,  
а вот работать с ним как с массивом, с помощью формул не получается, например  
=СУММ(СУММ(ДВССЫЛ({"A2:C1";"A6";"A10:G11"}))) возвращает то же что и    
=СУММ(Ч(ДВССЫЛ({"A2:C1";"A6";"A10:G11"}))) сумму первых ячеек диапазонов
 
{quote}{login=Саша}{date=13.08.2009 12:02}{thema=}{post}=СУММ(СУММЕСЛИ(ДВССЫЛ(ЕСЛИ(СТРОКА(A1:A15)/3=ОКРУГЛВНИЗ(СТРОКА(A1:A15)/3;0);"a"&СТРОКА(1:15);"a1"));"<>"))  
{/post}{/quote}  
 
=СУММ(Ч(ДВССЫЛ("A" & 3*СТРОКА(A1:A5))))  
 
а KL полагал, что не привинтим
 
У меня в первой половине дня мозг плохо работает :)  
Тем более после того, как разбирался с твоим вариантом, выдававшим некореткный результат, случайно использовав не-квадратную матрицу, т е ошибившись на 1 столбец. :)  
Так, конечно же, проще.
 
Может я чего-то не понял, но:  
1. Предположим, что в A1:A5 - числа, например, от 1 до 5.    
2. Выделить, к примеру, C1:C5 (или A10:A14 и т.п.)для получения массива сумм нарастающим итогом.  
3. Ввести формулу: =СУММ(A1:ИНДЕКС(A1:A5;СТРОКА(A1:A5);1))  
4. Нажать Ctrl-Shift-Enter
 
{quote}{login=dl}{date=13.08.2009 01:24}{thema=Re: }{post}{quote}{login=Саша}{date=13.08.2009 12:02}{thema=}{post}=СУММ(СУММЕСЛИ(ДВССЫЛ(ЕСЛИ(СТРОКА(A1:A15)/3=ОКРУГЛВНИЗ(СТРОКА(A1:A15)/3;0);"a"&СТРОКА(1:15);"a1"));"<>"))  
{/post}{/quote}  
 
=СУММ(Ч(ДВССЫЛ("A" & 3*СТРОКА(A1:A5))))  
 
а KL полагал, что не привинтим{/post}{/quote}  
про задачу со строками кратными 3-м я еще не сказал ни слова - мы обсуждали нарастающие диапазоны, но совершенно очевидно, что я не мог полагать, что не привинтите, хотя бы потому, что именно я выше привел пример извлечения значений из массива ссылок внутри СУММ ;-)
KL
 
{quote}{login=ZVI}{date=13.08.2009 02:45}{thema=}{post}Может я чего-то не понял, но:  
1. Предположим, что в A1:A5 - числа, например, от 1 до 5.    
2. Выделить, к примеру, C1:C5 (или A10:A14 и т.п.)для получения массива сумм нарастающим итогом.  
3. Ввести формулу: =СУММ(A1:ИНДЕКС(A1:A5;СТРОКА(A1:A5);1))  
4. Нажать Ctrl-Shift-Enter{/post}{/quote}  
насколько я понял, задачу требовалось решить в пределах одной ячейки :-) Выше я уже упоминал об использовании массивов в параметрах кроме первого функции ИНДЕКС - это возможно именно при одновременном вводе формулы одновременно в несколько ячеек, проблема в том, что не получается вернуть вес диапазон значений внутри одной ячейки. Кстати, в данном случае достаточно было бы обыкновенной формулы:  
=СУММ($А$1:ИНДЕКС($А$1:$А$15;СТРОКА(А1)))
KL
 
Вроде требовалось:  
> А хотелось получить массив из данных столбца B без создания, собственно, столбца B.  
 
А сумма ведь: =СУММ(A1:A5)  
 
Или я опять что-то не понял? :-)
 
требовалось прлучить сумму множества массивов, а не одного. Тема, породившая эту тему:  
http://www.planetaexcel.ru/forum.php?thread_id=9178
 
{quote}{login=dl}{date=13.08.2009 01:01}{thema=Re: А всё же что это за массив?}{post}{quote}{login=KL}{date=13.08.2009 11:29}{thema=}{post}Кстати, забыл добавить(не знаю, есть ли у этого практическое применение): для того, чтобы функция СУММ могла работать хотябы с первыми значениями массива диапазонов, их нужно конвертировать в массивы значений. Например:  
 
=СУММ(Ч(ДВССЫЛ({"A2:C1";"A6";"A10:G11"})))  
 
В данном случае суммируются значения ячеек A2, A6, A10{/post}{/quote}  
 
Дело в том что  
=СУММ(ДВССЫЛ({"A2:C1";"A6";"A10:G11"}))  
на самом деле возвращает массив сумм перичисленных диапазонов.  
Вывести эти суммы как массив можно,  
а вот работать с ним как с массивом, с помощью формул не получается, например  
=СУММ(СУММ(ДВССЫЛ({"A2:C1";"A6";"A10:G11"}))) возвращает то же что и    
=СУММ(Ч(ДВССЫЛ({"A2:C1";"A6";"A10:G11"}))) сумму первых ячеек диапазонов{/post}{/quote}  
DL, думаю, тут вы ошибаетесь, и разница принципиальная :-) На самом деле возвращается массив не сумм перечисленных диапазонов, а первых значений каждого из перечисленных диапазонов. Т.ч. в вашем варианте первая инстанция СУММ, которая как я уже говорил не переваривает массивов диапазонов, выполняет функции Ч(), превращая в значение то, что находилось в первой ячейке предложенных ей диапазонов. Не знаю, понятно ли я излагаю мысль.
KL
 
{quote}{login=KL}{date=13.08.2009 03:45}{thema=Re: }{post}насколько я понял, задачу требовалось решить в пределах одной ячейки :-) Выше я уже упоминал об использовании массивов в параметрах кроме первого функции ИНДЕКС - это возможно именно при одновременном вводе формулы одновременно в несколько ячеек, проблема в том, что не получается вернуть вес диапазон значений внутри одной ячейки. Кстати, в данном случае достаточно было бы обыкновенной формулы:  
=СУММ($А$1:ИНДЕКС($А$1:$А$15;СТРОКА(А1))){/post}{/quote}  
Даже еще проще: =СУММ($А$1:А1) :-)
KL
 
{quote}{login=KL}{date=13.08.2009 06:09}{thema=Re: Re: А всё же что это за массив?}{post} DL, думаю, тут вы ошибаетесь, и разница принципиальная :-) На самом деле возвращается массив не сумм перечисленных диапазонов, а первых значений каждого из перечисленных диапазонов. Т.ч. в вашем варианте первая инстанция СУММ, которая как я уже говорил не переваривает массивов диапазонов, выполняет функции Ч(), превращая в значение то, что находилось в первой ячейке предложенных ей диапазонов. Не знаю, понятно ли я излагаю мысль.{/post}{/quote}  
 
после экспериментов выяснилось что мы оба не совсем правы.  
формулы массива такого вида, возвращающие массив в диапазон ячеек,  
работают как несколько "инстантаций" одной формулы, для каждой ячейки в возвращаемом диапазоне, вычисляется введённая формула, но для неё используются свои исходные данные.  
=СУММ(ДВССЫЛ({"A2:C1";"A6:B6";"A10:G11"}))  
возврашающая значения в B14:D14  
для первой ячейки вычисляется сумм("A2:C1"), ну и т.д  
 
Разумеется это представляет чисто академический интерес, но всё таки интересно было бы как нибудь научиться работать с такими конструкциями, хотя эксель видимо этого не позволит.  
 
Заставить эксель считать что формула должна возвращать определённое число значений, будто вывод результатов производиться в несколько ячеек проблематично.  
 
Вот ещё примеры странных массивов  
 
=НАИБОЛЬШИЙ((СМЕЩ(B2:J2;СТРОКА(1:5);0;;));2)  
возвращает в столбец вторые наибольшие из каждой смещённой строки  
=СУММ(НАИБОЛЬШИЙ((СМЕЩ(B2:J2;СТРОКА(1:5);0;;));2))  
возвращает в сттроку вторые наибольшие из столбцов полученных в результате смещения соответствующей ячейки  
 
примеры формул в файле
 
DL,  
 
1) Мне кажется, мы говорили о данных формулах в применении к одной ячейке и то, что я сказал ранее, новым примером никак не опровергается, а наоборот подтверждается.  
 
2) Поведение при матричнов вводе в несколько ячеек сразу, которое вы описываете, свойственно всем функциям не работающим с массивами в каком-либо из их параметров. Т.е. к свойствам конкретной функции это никакого отношения не имеет и обусловлено тем, как интерпретирует Excel формулы введенные с помощью {Ctrl+Shift+Enter} в несколько ячеек. При этом векторы и размеры массивов параметров должны совпадать с вектором и размером массива диапазона, куда введена формула. В данном случае вы строго соблюдаете правило: в одной ячейке - один параметр, и функция СУММ() не вступает во взаимодействие с массивом диапазона. Примеры других функций:  
 
[A1]=1
[A2]=3
[B1]=1
[B2]=11
[C1:C2]={=ПОИСКПОЗ({4:10};ДВССЫЛ({"A1:A2":"B1:B2"}))}
 
[A1]=11
[A2]=22
[A3]=33
[C1:C2]={=ИНДЕКС(A:A;{1:2:3})}
KL
 
*и функция СУММ() не вступает во взаимодействие с массивом диапазонов.
KL
 
{quote}{login=Саша}{date=13.08.2009 08:45}{thema=Массив с нарастающим итогом.}{post}Немного корявое название, извиняюсь.    
Т е, в данном случае, нечто вроде:  
СУММ(A2:ИНДЕКС(A2:A6;СТРОКА(A1:A5))) или СУММ(A2:ДВССЫЛ("a"&СТРОКА(A2:A6)))  
{/post}{/quote}  
 
{=СУММ(СУММЕСЛИ(ДВССЫЛ("A1:A"&СТРОКА(A1:A5));"<>"))}
Страницы: 1
Читают тему
Наверх