2008-11-24 8 views
4

У меня есть формула массива SUM, которая имеет несколько вложенных операторов IF, что делает ее очень неэффективной. Моя формула охватывает более 500 строк, но вот простой ее вариант:Пытается повысить эффективность формулы массива

{=SUM(IF(IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17>0, 
IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17,0))} 

Как вы можете видеть, первая половина формулы проверок, где массив больше нуля, и если они есть, это подводит во второй части формулы.

Вы заметите, что один и тот же оператор IF повторяется дважды, что для меня неэффективно, но это единственный способ получить правильный ответ.

В примере данных у меня выглядит следующим образом:

Sample Data in spreadsheet http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example.jpg Ответ должен быть в данном случае 350, используя формулу I, упомянутых выше.

Если бы я попытался поставить в заявлении MAX в массиве, поэтому удаление тест, чтобы найти, где она была больше нуля, так что это было так:

{=SUM(MAX(IF(B2:B6>B8:B12,B2:B6,B8:B12)-B14:B18,0))} 

Тем не менее, кажется, что это только вычисляет первую строку данных в каждом диапазоне, и это дало мне неправильный ответ 70.

Кто-нибудь знает, что я могу уменьшить размер формулы или сделать ее более эффективной, не повторяя IF заявление там?


UPDATE

Джимми

формула MAX вы предложили работать на самом деле техника его подводит для всех сценариев.

Если я изменил мой образец данных в строках 1 до 5, как показано ниже (показывая, что некоторые из чисел больше их соответствующих ячеек в строках 7 до 11, в то время как некоторые из чисел ниже)

Sample Data in spreadsheet http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example2.jpg

правильный ответ им пытаются для того чтобы достигнуть 310, однако вы предложили формулу MAX дает неправильный ответ 275.

Im угадывание формула должна быть функцией массива, чтобы дать правильный ответ.

Любые другие предложения?

ответ

3
=MAX(MAX(sum(A1:A5), sum(A7:A11)) - sum(A13:A17), 0) 
+0

Спасибо. Кажется, он работает быстрее, чем может быть массив. – user40432 2008-11-25 03:35:57

0

Возможно, вы захотите ознакомиться с редактором VB Macro. В меню «Сервис» перейдите в «Макросы» и выберите «Visual Basic Editor». Это дает целую среду программирования, где вы можете написать свою собственную функцию.

VB - это простой язык программирования, и у Google есть все необходимые справочники.

Здесь вы можете написать функцию MySum() и заставить ее делать любую математику, в которой вы действительно нуждаетесь, в ясной форме, написанной вами самим.

Я снял это с Google, и это похоже на хорошее руководство по настройке всего этого. http://office.microsoft.com/en-us/excel/HA011117011033.aspx

0

Это похоже на работу:

{=SUM(IF(A1:A5>A7:A11,A1:A5-A13:A17,A7:A11-A13:A17))} 

EDIT - не обрабатывает случаи, когда вычитание заканчивается отрицательным

Это работает - но это более эффективным ???

{=SUM(IF(IF(A1:A5>A7:A11,A1:A5,A7:A11)>A13:A17,IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17,0))} 
+0

Это почти так же, как моя оригинальная формула – user40432 2008-11-27 01:36:55

+0

Правда - но я только вычитаю один раз – 2008-11-27 17:04:59

0

Что относительно этого?

=MAX(SUM(IF(A1:A5>A7:A11, A1:A5, A7:A11))-SUM(A13:A17), 0) 

Edit:

Woops - пропущенный выбрасывая негативы часть. Как насчет этого? Не уверен, что это быстрее ...

=SUM((IF(A1:A5>A7:A11,IF(A1:A5>A13:A17,A1:A5,A13:A17),IF(A7:A11>A13:A17,A7:A11,A13:A17))-A13:A17)) 

Edit 2:

Как это выполнить для Вас?

=SUM((((A1:A5>A13:A17)+(A7:A11>A13:A17))>0)*(IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17)) 
1

Более расчет эффективных (и особенно повторного вычисления эффективный) способ заключается в использовании вспомогательных столбцов вместо массива формул:

C1: =MAX(A1,A7)-A13
D1: =IF(C1>0,C1,0)

копирования оба эти вниз 5 рядов

E1: =SUM(D1:D5)

Excel будет только пересчитывать формулы, зависящие от любого измененного значения, вместо того, чтобы вычислять все виртуальные столбцы, подразумеваемые формулой массива, каждый раз, когда изменяется любое число. И он делает меньше вычислений, даже если вы меняете все числа.