Страницы: 1
RSS
общая формула суммы по структуре
 
имеется: список-структура.  
в примере для наглядности строки сгруппированы, в реале - не будут  
структура описывается в доп.столбце - ручками ставится № уровня.  
нужна общая формула суммы для любого уровня - как суммы нижележащих строк с уровнем на 1 больше текущего, но с ограничением - суммировать строки до следующего уровня, равного текущему.  
мне кажется, что-то подобное уже было. возможно - не раз.  
но то ли поиск меня не понял, то ли у него настроения нет - короче, ничего путного за приемлемое время я не нашёл.  
 
со своими формульными "талантами" я нагородил бог весть что :(  
правда - рабочее, но уж больно некузявое.  
   
прошу уважаемых планетян-формулистов помочь мне либо подкорректировать мой вариант, либо предложить своё чудо-решение.  
чтобы не было скучно - бзики от начальства:  
- больше никаких доп.столбцов (хоть вручную. хоть формулами);  
- никаких "трёх пальцев"  
:)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
пс. excel-2000, 2002, 2003
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
А чего там корректировать? Мне нравится.  
Саша, в чем по твоему некузявость?
 
Разве что СУММПРОИЗВ() заменить на СУММЕСЛИ() - будет чуть быстрее.  
А с заданием диапазонов лучше не придумаешь...
 
ннууу...  
как-то длинно получилось.  
и эти вынужденные ЕНД() с двойнвм расчетом ПОИСКПОЗ()...  
увы, до ЕОШИБКА() майкрософт додумался лишь в 2007-м.  
 
Игорь, из спортивного интереса (плюс есть шанс убедить начальство):  
формулой массива было бы намного короче?  
тормоза не страшны - объемы не слишком большие, хотя...  
строк - около 200, ну и столбцы - по рабочим дням месяца плюс по декадам плюс "итого" - около 25.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{=СУММ((МИН(ЕСЛИ(A9:A$38=A8;СТРОКА(A9:A$38)))>=СТРОКА(A9:A$38))*(A9:A$38=A8+1)*B9:B$38)}  
Но я думаю что тут еще проверку на отсутствующие нужно делать...
 
вот вполне "кузявый", на мой взгляд, вариант с UDF  
но, видимо, некоторых людей макросами ещё в яслях напугали до икоты :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Формулу редактировал в ячейке B8
 
{quote}{login=kim}{date=29.07.2012 02:06}{thema=}{post}{=СУММ((МИН(ЕСЛИ(A9:A$38=A8;СТРОКА(A9:A$38)))>=СТРОКА(A9:A$38))*(A9:A$38=A8+1)*B9:B$38)}{/post}{/quote}  
а вот это уже красиво. спасибо.  
у меня что-то гораздо запутаннее получалось, да и то местами неверно считало :)  
файлик к предыдущему посту не прикрепился. но тогда уж - все три варианта:
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Для того чтобы не делать проверку, можно так.
 
вариант:  
=СУММЕСЛИ(A3:ИНДЕКС(A3:A$42;МАКС(МИН(ЕСЛИ(A3:A$42=A2;СТРОКА(A3:A$42)-СТРОКА()));1));A2+1;B3)
 
ага. распутался я со своим вариантом массива :)  
все варианты в одном флаконе (внимание - есть одна неверная сумма:)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
прикольно, формулы совпали
 
Михаил :)  
а диапазон до 42-й строки откуда и зачем?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
"а диапазон до 42-й строки откуда и зачем?"  
достаточно 39  
пока щелкал файлы, увидел что заполнено до 41, поэтому попровил формулу  
потом пригляделся, а у игоря аналогичная оказалась, так что зря выкладывал
 
МСН (коварным голосом), а не-массивно? будет чудо? :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Не массивно, но летуче :)  
=СУММЕСЛИ(A3:ИНДЕКС(A3:A$41;ПОИСКПОЗ(A2;A3:A$41;));A2+1;B3)
 
=СУММЕСЛИ(A3:ИНДЕКС(A3:A$42;СУММПРОИЗВ(ПОИСКПОЗ(A2;A3:A$42+(A3:A$42="")*A2;)));A2+1;B3)  
 
не нужно указывать пустые уровни в конце списка, достаточно указать на одну пустую ячейку ниже
 
немассивно, нелетуче:  
=СУММПРОИЗВ((A3:ИНДЕКС(A3:A$42;СУММПРОИЗВ(ПОИСКПОЗ(A2;A3:A$42+(A3:A$42="")*A2;)))=A2+1)*B3:ИНДЕКС(B3:B$42;СУММПРОИЗВ(ПОИСКПОЗ(A2;A3:A$42+(A3:A$42="")*A2;))))  
=СУММЕСЛИ(A3:ИНДЕКС(A3:A$42;СУММПРОИЗВ(ПОИСКПОЗ(A2;A3:A$42+(A3:A$42="")*A2;)));A2+1;B3:ИНДЕКС(B3:B$42;СУММПРОИЗВ(ПОИСКПОЗ(A2;A3:A$42+(A3:A$42="")*A2;))))
 
тэээк-с...  
чувствую одним местом - переутомился я :(  
пока не догоняю последние варианты.  
 
в любом случае - всем огромное спасибо.  
после перерыва продолжу насиловать мозг :)))
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ладно, последний от меня вариант, без указания пустых и вспомагательных:  
=СУММЕСЛИ(A3:ИНДЕКС(A3:A$38;ПОИСКПОЗ(A2;A3:A$38;-1));A2+1;B3)
 
"ура! случилоссь чудо! друг спас друга!!!" (с)  
не зря я надеялся на простое, короткое и элегантное решение.  
правда, для этого пришлось помучить наших гуру, устроив небольшое соревнование :)  
 
СПАСИБО огромное!  
 
пс. в аттаче - вся история болезни.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Страницы: 1
Наверх