2014-01-26 1 views
1

Мне нужно получить MAX диапазона, связанного двумя 1s в столбце помощника.Сложная формула с использованием КОСВЕННЫХ, АДРЕСОВ И МАТЧА - есть ли лучший способ?

1s - это переменное количество рядов.

В качестве примера, вот пример того, что я говорю:

 
1 
0 -1.10% 
0 0.00% 
1 
0 1.43% 
0 1.15% 
0 2.12% 
0 2.69% 
0 1.32% 
0 0.86% 
0 -0.69% 
1 
~ 
[and so on] 

Так, например, есть два диапазона видно, что я заинтересован в здесь - диапазон между строки 1 и 4 и диапазон между строками 4 и 12.

В третьей колонке, где есть 1 в вспомогательной колонке, я хочу МАКС. диапазонов.

Мне удалось собрать эту формулу, которая выполняет задание (это скопировано непосредственно из электронной таблицы, так что оно находится в строке 122, а данные в настоящее время идут в строку 16120, вспомогательный столбец - столбец E и столбец с значения является F):

=IF(E122=1,MAX(F122:INDIRECT(ADDRESS(ROW()+MATCH(1,E123:$E$16120,0),COLUMN(F122),4))),"") 

Моя основная мысль заключается в создании в нижней части диапазона, глядя на следующий 1 вниз колонке хелперов (с использованием MATCH), добавить, что в текущей строке (с использованием полосы отвода и COLUMN), завернутый в функцию ADDRESS, а затем связать все вместе, используя INDIRECT. Наконец, он сидит внутри IF, чтобы поражать строки только 1 в вспомогательной колонке.

Может ли кто-нибудь подумать о более элегантном, менее громоздком способе?

Заранее спасибо.

ответ

5

Если у вас есть больший набор данных, я бы рекомендовал использовать INDEX вместо OFFSET! Последний является изменчивым, то есть Excel будет пересчитывать все формулы OFFSET и любые иждивенцы каждый раз, когда он совершает какой-либо перерасчет. INDEX, с другой стороны, является энергонезависимым, то есть только в том случае, если какой-либо из его предшественников изменится, Excel пересчитает формулу.

Поэтому дать эту формулу попробовать:

=IF(E122=1,MAX(F123:INDEX(F123:$F$16120,MATCH(1,E123:$E$16120,0))),"") 
+3

+1! Хороший ответ! Я знаю, что 'OFFSET' нестабилен и думал об использовании' INDEX', но я не знаю об трюке 'MAX (F123: INDEX (..))'. Спасибо, что неожиданно научили меня! –

+0

Ничего себе - еще лучше. Спасибо всем. Я знал, что должен быть оптимальный путь по сравнению с моим сумасшедшим решением. – EndlessLoop

+2

@simoco: В течение многих лет я также использовал OFFSET во многих ситуациях. Потребовалось некоторое время, чтобы понять, что ':' на самом деле является оператором, и можно заменить почти любой 'OFFSET' на' INDEX (...): INDEX (...) '. –

2

Вы можете использовать OFFSET:

=IF(E122=1,MAX(OFFSET(E122,1,1,MATCH(1,E123:$E$16120,0)))-1,"") 
+1

Намного лучше. Конечно, OFFSET работает здесь. По какой-то причине я убедил себя, что это не так, и обошел его с трудом. Большое спасибо. – EndlessLoop

+1

+1 также жизнеспособный способ - и отлично (и меньше головной боли тогда мой ответ) в небольших файлах. –

+1

Если я ошибочно понял, что INDEX вернул * значение * ячейки. Урок: прочитайте документацию! – EndlessLoop

Смежные вопросы