Страницы: 1
RSS
Опять проблемы с формулой массива
 
Не работает как надо формула массива. Пример и объяснение в файле. Спасибо
 
Почему не работает формула, разобрался. Она берет проверяет только первое значение диапазона. Как сделать правильно?  
Диапазон            Проверка условия  
 
В8                  0,3*макс(В8:В8)+0,7*В8  
В9                  0,3*макс(В8:В9)+0,7*В8  
В10                 0,3*макс(В8:В10)+0,7*В8  
В11                 0,3*макс(В8:В11)+0,7*В8  
В12                 0,3*макс(В8:В12)+0,7*В8  
 
Если все условия выполняются, то выдается значение Истина, иначе Ложь. Как сделать это в одной ячейке формулой массива?
 
{=И((E14:E18)>=(0,3*F14:F18+0,7*$E$14))}
 
Михаил, мне нужна проверка максимума не на том же диапазоне (это было бы просто), а на меняющемся. Посмотрите приложенный файл в первом сообщении.  
Я в принципе нашел ветку форума где это обсуждалось (http://www.planetaexcel.ru/forum.php?thread_id=9197), сижу разбираюсь...
 
Я собственно сделал то, что хотел. Результат такой:  
 
{=СУММ(ЕСЛИ(B8:B12>=0,3*ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(B8;;;СТРОКА(B8:B12)-7;))+0,7*B8;0;1))}  
 
Заодно открыл для себя функцию промежуточные итоги, очень удобная штука. Если макс(СМЕЩ(B8;;;СТРОКА(B8:B12)-7;)) не работает с массивом, то ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(B8;;;СТРОКА(B8:B12)-7;)) отлично справляется.
 
В принципе Вам немного не хватило в первоначальной формуле. Надо было условие проверить функцией И:  
=ЕСЛИ(--И(ИНДЕКС(B:B;СТРОКА()-4):ИНДЕКС(B:B;$C$1+1)>=0,3*МАКС(ИНДЕКС(B:B;СТРОКА()-4):ИНДЕКС(B:B;СТРОКА(ИНДЕКС(B:B;СТРОКА()-4):ИНДЕКС(B:B;$C$1+1))))+0,7*ИНДЕКС(B:B;СТРОКА()-4));"ХОРОШО";"ПЛОХО")
 
Нет, так не будет работать. "Плохо" выдается только, если какое-то число в диапазоне ниже начального, а если оно хотя бы на его уровне, то выдается "Хорошо", а это неправильно.  
 
Для задачи мой полный вариант выглядит так:  
 
=СУММ(ЕСЛИ(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1)>=0,3*ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(ИНДЕКС(B:B;СТРОКА()-($E$1-1));;;СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))-(СТРОКА()-$E$1);))+0,7*ИНДЕКС(B:B;СТРОКА()-($E$1-1));"Хорошо";"Плохо"))  
 
Однако, сейчас встала проблема еще хуже. Нужно составить массив из номеров строк локальных максимумов. То есть:  
 
В8  45 (максимум A1:A1=45), следовательно, в массив заносится 8  
В9  55 (максимум A1:A2=55), следовательно, в массив заносится 9  
В10 50 (максимум A1:A3=55), следовательно, в массив заносится 9  
В11 43 (максимум A1:A4=55), следовательно, в массив заносится 9  
В12 56 (максимум A1:A5=56), следовательно, в массив заносится 12  
 
Вот эта задача для меня жесть, уже столько времени потратил.  
Смог получить массив из номеров строк локальных максимумов формулой  
=ЕСЛИ(B8:B12=ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(B8;;;СТРОКА(B8:B12)-7;));СТРОКА(B8:B12);"")  
что даст массив 8,9,,,12. А вот как пустые значения приравнять предыдущему максимуму ума не приложу. Должно быть (8,9,9,9,12)
 
Пример следует читать так:  
 
В8 45 (максимум В8:В8=45), следовательно, в массив заносится 8  
В9 55 (максимум В8:В9=55), следовательно, в массив заносится 9  
В10 50 (максимум В8:В10=55), следовательно, в массив заносится 9  
В11 43 (максимум В8:В11=55), следовательно, в массив заносится 9  
В12 56 (максимум В8:В12=56), следовательно, в массив заносится 12
 
Пока вариант первой формулы. Без массива:  
=ЕСЛИ(И(B8>=(0,3*МАКС(СМЕЩ(B8;;;1;))+0,7*B8);B9>=(0,3*МАКС(СМЕЩ(B8;;;2;))+0,7*B8);B10>=(0,3*МАКС(СМЕЩ(B8;;;3;))+0,7*B8);B11>=(0,3*МАКС(СМЕЩ(B8;;;4;))+0,7*B8);B12>=(0,3*МАКС(СМЕЩ(B8;;;5;))+0,7*B8));"ХОРОШО";"ПЛОХО")
 
Понимаете, в чем проблема. Если бы мне нужно было это решить для массива из 5 элементов, то это не было бы проблемой. Однако данных значений в массиве несколько тысяч. Происходит проверка на максимумы снизу вверх (то есть последние 5 элементов проверяются, потом тоже самое с последними 6 элементами и т.д.). Я буду растягивать формулу массива снизу вверх. Отсюда в моем пример функция индекс. Поэтому ту логику, которую вы предлагаете (В8, В9... и т.д. записанные руками) нереально применить.  
Основная проблема в том, что есть ни один диапазон, а массив диапазонов (В8:В8, В8:В9...). Используется функция СМЕЩ, вместо более любимого мной ИНДЕКСа. ИНДЕКС просто не работает с массивом диапазонов (он берет первое значение и все), а также не работают НАИБОЛЬШИЙ или ПОИСКПОЗ или СТРОКА просто не работают. Призодится извращаться с суммесли, счетесли и промежуточн.итоги.  
 
Но ничего не получается ((
 
{quote}{login=Kirk}{date=23.01.2010 07:59}{thema=}{post}  
...А вот как пустые значения приравнять предыдущему максимуму ума не приложу. Должно быть (8,9,9,9,12){/post}{/quote}  
Вот такая связка должна вернуть требуемый массив:  
ПОИСКПОЗ(ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(B8;;;СТРОКА(B8:B12)-7;));B1:B12;0)  
или у Вас уже получилось по другому сделать? Чего-то то я не особо вник в задачу :(
 
Имхо, не всегда решения, засунутые в одну формулу, являются наилучшими с точки зрения производительности. Воспользутесь доп. столбцом.
 
Я все-таки сделал!!! Не знаю насколько интересно, но получился вот такой монстр:  
 
{=ЕСЛИ((СУММ(ЕСЛИ(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1)>=0,3*ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(ИНДЕКС(B:B;СТРОКА()-($E$1-1));;;СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))-(СТРОКА()-$E$1);))+0,7*ИНДЕКС(B:B;СТРОКА()-($E$1-1));0;1))=0)*(СУММ(ЕСЛИ(ПОИСКПОЗ(ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(ИНДЕКС(B:B;СТРОКА()-($E$1-1));;;СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))-(СТРОКА()-$E$1);));ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1);0)>=0,5*(СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))+$E$1-СТРОКА());0;1))=0);"Хорошо";"")}  
 
Он проверяет два условия:  
1. Не было ли на диапазоне хотя бы одной цены, которая была ниже 70% от максимума на тот момент  
2. Если максимум не обновлялся дольше, чем срок, прошедший с момента последнего максимума.  
Если оба условия выполняются, то компьютер радуется и говорит "Хорошо". А иначе молчит.  
Главное, что я теперь могу эту формулу растягивать, расширяя диапазон, а затем уже с ним работать. Я думал на тему доп столбцов, но в данном случае это просто невозможно, так как допстолбцами являются массивы (максимумов и номеров их строк каждого из диапазонов), то есть у каждой ячейки будет свой массив, что невозможно вывести при большом количестве ячеек.
 
Полностью не вник, но откуда у Вас уверенность, что в доп. столбцах не получится без формул массива?  
"Однако данных значений в массиве несколько тысяч" - вот на таком диапазоне "массивная" формула покажет тормоза.
 
Задачу понял так. необходимо для каждой строки определить диапазон включительно от этой строки и до конца массива, найти максимум в этом диапазоне и проверить значения диапазона - каждое должно быть не ниже 70% максимального значения.  
"Если максимум не обновлялся дольше, чем срок, прошедший с момента последнего максимума" - эта часть пониманию не поддалась :)  
 
По поводу определения  в доп. столбце длины массива:  
СЧЕТ(весь_диапазон)-СТРОКА()+1 даст длину требуемого диапазона.
 
А вот такой вариант не подойдёт?  
с2=ЕСЛИ(B2>0,7*МАКС($B$2:B2);"хорошо";"плохо")  
и растягиваем вниз.  
Если нет, объясните нормально пожалуйста, что вам нужно.
 
Как я понял, нужен максимум с конца, типа:  
=МАКС(B2:$B$1000)
Страницы: 1
Наверх