Пытаясь улучшить эффективность формулы массива - PullRequest
4 голосов
/ 25 ноября 2008

У меня есть формула массива 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 повторяется там дважды, что для меня неэффективно, но это единственный способ получить правильный ответ.

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

Пример данных в электронной таблице http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example.jpg В этом случае ответ должен быть 350, используя формулу, упомянутую выше.

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

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

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

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


ОБНОВЛЕНИЕ

Jimmy

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

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

Пример данных в электронной таблице http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example2.jpg

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

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

Есть еще предложения?

Ответы [ 5 ]

3 голосов
/ 25 ноября 2008
=MAX( MAX( sum(A1:A5), sum(A7:A11) ) - sum(A13:A17), 0)
1 голос
/ 02 декабря 2008

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

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

скопируйте оба этих 5 строки вниз

E1: =SUM(D1:D5)

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

0 голосов
/ 27 ноября 2008

Как насчет этого?

=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))

Редактировать 2:

Как это работает для вас?

=SUM((((A1:A5>A13:A17)+(A7:A11>A13:A17))>0)*(IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17))
0 голосов
/ 25 ноября 2008

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

{=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 голосов
/ 25 ноября 2008

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

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

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

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

...