2015-02-26 3 views
2

Согласно нескольким веб-сайтам, SUMIFS и COUNTIFS быстрее, чем SUMPRODUCT (например: http://exceluser.com/blog/483/excels-sumifs-or-sumproduct-which-is-faster.html). У меня есть лист с неизвестным количеством строк (около 200 000), и я рассчитываю отчеты об исполнении с цифрами. У меня более 6000 раз почти одинаковые формулы SUMPRODUCT с разной разницей (меняются только условия).Оптимизация формул Excel - SUMPRODUCT vs SUMIFS/COUNTIFS

Вот пример того, что я получил:

=IF(AFO4>0, 
(SUMPRODUCT((Sheet1!$N:$N=$A4) 
*(LEFT(Sheet1!$H:$H,2)="1A") 
*(Sheet1!$M:$M<>"service catalog") 
*(Sheet1!$J:$J="incident") 
*(Sheet1!$I:$I<>"self-serve") 
*(Sheet1!$AK:$AK=AFM$1) 
*(Sheet1!$E:$E>=$E$1) 
*(Sheet1!$E:$E<$E$2)) 
+SUMPRODUCT((Sheet1!$AJ:$AJ=$C4) 
*(LEFT(Sheet1!$H:$H,2)="1A") 
*(Sheet1!$M:$M<>"service catalog") 
*(Sheet1!$J:$J="incident") 
*(Sheet1!$I:$I="self-serve") 
*(Sheet1!$AK:$AK=AFM$1) 
*(Sheet1!$E:$E>=$E$1) 
*(Sheet1!$E:$E<$E$2)))/AFO4,0) 

рассчитав, что вещь занимает немного больше, чем на 1 секунду. Поскольку у меня есть более 6000 таких формул, для вычисления всего требуется более часа.

Итак, теперь я смотрю, как я мог бы оптимизировать эту формулу. Могу ли я преобразовать его в SUMIFS? Было бы быстрее? Все, что я суммирую здесь, это 0s и 1s, я просто подсчитываю количество строк в моем источнике данных (Sheet1), где выполняется множество условий. Может быть, COUNTIFS будет работать лучше?

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

Я могу использовать VBA, если это помогает, но я всегда слышал, что формулы Excel обычно быстрее.

+3

Обычно COUNTIFS будет примерно в 3 раза быстрее - вы можете использовать подстановочный знак вместо критерия LEFT –

+0

@pnuts У меня есть еще несколько ограничений, которые бы мешали эффективно использовать фильтры. Эти 6000 формул являются наихудшей частью таблицы формул 200 тыс. Формул. Для расчета всего рабочего листа «СУММЫ» выше более 90% времени выполнения. – dnLL

+0

@barryhoudini Не могли бы вы привести пример в качестве ответа на вопрос о том, как вы преобразовали бы мой «SUMPRODUCT» в «COUNTIFS» только с моим первым «SUMPRODUCT» выше и первым 2 критерием? Я просто не знаю, что вы подразумеваете под шаблоном. – dnLL

ответ

1

первый SUMPRODUCT может стать

=COUNTIFS(Sheet1!$N:$N,$A4,Sheet1!$H:$H,"1A*",Sheet1!$M:$M,"<>service catalog",Sheet1!$J:$J,"incident",Sheet1!$I:$I,"<>self-serve",Sheet1!$AK:$AK,AFM$‌​1,Sheet1!$E:$E,">="&$E$1,Sheet1!$E:$E,"<"&$E$2)

LEFT часть может быть обработана с помощью шаблона, как показано

изменения второй части по той же схеме

5

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

Вот некоторые материалы из книги, которую я пишу, где я сравниваю SUMPRODUCT, SUMIFS, DSUM, сводные таблицы, расширенный фильтр и что-то называемое Range Slicing (которое использует умные комбинации INDEX/MATCH на отсортированных данных) условно суммируйте записи в таблице, которая содержит более 1 миллиона записей продаж, на основе выбора, который вы делаете из 10 разных выпадающих списков:

Эти выпадающие списки позволяют фильтровать базу данных с помощью комбинации Хранилища, сегмента, вида, пола, платежа , Cust. История, статус заказа, инструкции по доставке, столбцы «Тип участия» и «Порядок». Таким образом, есть довольно симпатичная гигантская фильтрация и агрегация, чтобы уменьшить эти миллионные записи до одной суммы. Файл описывает шесть различных способов для достижения этого результата, первые три из которых показаны на рисунке ниже: First Three Options

Как и следовало ожидать, когда все эти выпадающие устанавливаются те же настройки, вы получите точно тот же ответ из шести подходов. Но то, чего вы не ожидаете, - это то, насколько медленным SUMPRODUCT является вычисление нового ответа, если вы измените одно из этих выпадающих списков по сравнению с другими подходами. На самом деле, оказывается, что подход SUMIFS в 15 раз быстрее, чем SUMPRODUCT, придумывая ответ на этот массив мамонтов. Но это ничего: подход нарезки диапазона в 56 раз быстрее!

Подход Range Slicing работает, сортируя исходные данные, а затем используя серию умных формул в вспомогательных столбцах, чтобы умело идентифицировать, где какие-либо учетные записи находятся в пределах этих отсортированных данных. Это означает, что вы можете напрямую суммировать только несколько записей, которые соответствуют, а не выполнять сложный критерий, сопоставляемый сотням тысяч строк (или против миллиона строк, как в примере здесь).

Вот как это выглядит с точки зрения моего образца файла. Число в столбце поддержки строк в правой части показывает, что с помощью некоторого умного устранения функция SUM внизу должна обрабатывать только 18 строк данных (строки от 292996 до 293014), а не все 1 миллион строк. Другими словами, это очень эффективно.

enter image description here

А вот вторая группа альтернатив:

Next three options

Да, вы можете довольно легко использовать сводную таблицу здесь. И подход PivotTable, по-видимому, примерно в 6 раз быстрее, чем SUMPRODUCT, хотя при вызове фильтров вы получаете небольшую дополнительную задержку, и при первом запуске операции фильтрации требуется еще немного больше времени, поскольку Excel должен загружать PivotCache в память. Но давайте посмотрим правде в глаза: создание сводной таблицы в первую очередь является самым простым из всех этих подходов, поэтому у меня есть мой голос.

Подход DSUM в 12 раз быстрее, чем SUMPRODUCT. Это не так хорошо, как SUMIFS, но это все еще значительное улучшение. Подход Advanced Filter работает только в 4 раза быстрее, чем SUMPRODUCT, что не удивительно, потому что то, что он делает, - это извлечь все записи из исходных данных, которые соответствуют критериям в этом списке, выгрузить его в электронную таблицу и затем суммировать результат.

+0

Ну, это действительно интересно. Я не уверен, что это применимо. У меня более 2000 столбцов данных, но они разделены на разные части: информация о сотрудниках находится в первых столбцах, затем данные из их расписания, а затем несколько сотен столбцов данных по их телефонным звонкам (статистика центров обработки вызовов) , затем на некоторые другие действия (мы также получаем запросы из веб-формы) и многое другое (все раскладываются на каждый месяц). Кроме того, по моему опыту, сводные таблицы, как правило, имеют проблему при использовании для таблицы 200x2000 (теперь мы имеем более 400 тыс. Ячеек/формул). – dnLL

+0

Кроме того, мне в основном нужно иметь эту таблицу со всей информацией (> 400 тыс. Ячеек), доступной одновременно для выполнения моих графиков. Во всяком случае, это сильно улучшилось с SUMIFS. Вычисление 400 тыс. Клеток занимает около 1 часа вместо ~ 30 часов. Самая длинная часть - это собственно ручная проверка источников данных (т. Е. Сотрудников, не входящих в расписание), а не на 1 час времени, требуемого ЦП (что может быть сделано во время запуска, чего не было, когда это было 30 + часов). – dnLL

+0

Откуда берутся данные? Это звучит неустойчиво для меня ... особенно если данные со временем будут расти. Я думаю, что лучший подход будет заключаться в том, чтобы подключить Excel к соответствующей базе данных или базам данных и просто сосать данные, которые уже были объединены с тем, как вам это нужно. – jeffreyweir

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