2016-05-14 2 views
3

У меня есть следующая формула, которую я объясню ниже:скорость вверх формула массива

{=SUM(IF(($G$1:$L$1=$O$1)*($G$2:$L$2=$O$2)*($G$3:$L$3=$O$3)*($G$4:$L$4=$O$4)*($G$5:$L$5=$O$5)*($G$6:$L$6=$O$6)*($G$7:$L$7=$O$7);G21:L21))} 

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

enter image description here

Под колоннами G - L мы иметь «базу данных» всех данных. Эти столбцы будут добавляться кумулятивно каждый квартал (около 30 столбцов в квартал). Итак, через несколько лет мы закончили с кучей столбцов базы данных (1000 + столбцы исходных данных). Ради этой демонстрации я включил только эти шесть столбцов.

Как вы можете видеть, каждый столбец содержит конкретные параметры между рядами 1 - 7, что позволяет идентифицировать конкретный код страны + код проекта + категорию + финансовый год, + ... (и т. Д.). Это позволяет нам отслеживать уникальный конкретный проект и извлекать его данные.

Что мы имеем после этого на колонке O является конкретным проектом, который мы пытаемся получить значение (вы можете видеть, что строки 1 - 7 такие же, как в колонке G (мы пытаемся для получения значений для данного конкретного проекта).

enter image description here

Здесь приходит нашу формулу. Я прикрепил выше. Вот как это выглядит, когда я нажимаю F2 . Как вы можете видеть IF оператор сначала просто проверяет, соответствуют ли конкретные столбцы заданным критериям в столбце O и суммирует все столбцы, соответствующие всем критериям между строками 1-7.

Теперь вот в чем проблема. У нас есть рабочий лист, который содержит 20 проектов (например, столбец O), и мы используем эту формулу массива для извлечения значений. Проблема в том, что извлечение данных с использованием этого способа занимает много времени. Мы также приняли принцип через VBA, который мы итерируем по всем ячейкам, затем вставляем формулу, вычисляем ячейку массива, а затем копируем & Вставляем результирующее значение внутри (чтобы мы не закончили с полным списком формул массива). Однако по-прежнему требуется LONG для расчета (1 минута или около того).

Мне было интересно, если есть лучшее решение, как получить данные в уже упомянутом формате (это означает, что у нас есть конкретные критерии, которые мы пытаемся найти)? Может быть, SUMIFS может быть лучше? Или sumproduct? Или даже совершенно отличное решение?

Я открыт для любого предложения, которое закрепило бы процесс.

+0

Сколько строк в столбце O содержит эту формулу? – BrakNicku

+0

Вы связали стандартный SUMIFS(); '= СУММЕСЛИМН (G21: L21; $ G $ 1: $ L $ 1; $ O $ 1, $ G $ 2: $ L $ 2; $ O $ 2; $ G $ 3: $ L $ 3; $ O $ 3; $ G $ 4: $ L $ 4; $ O $ 4; $ G $ 5: $ L $ 5; $ O $ 5; $ G $ 6: $ L $ 6; $ O $ 6; $ G $ 7: $ L $ 7; $ O $ 7) ' –

ответ

1

Я встретил аналогичную проблему около 2 недель назад. Сначала я использую вспомогательный столбец/строку. Хелперная колонка должна конкатенировать 7 строк в каждом столбце. то используйте функцию IF, чтобы проверить соответствие совпадающего текста.Такие, как, предполагая, что вспомогательный ряд является строка 8 согласно вашему образцу, формула ячейки G8 будет

=CONCATENATE(G1,"|",G2,"|",G3,"|",G4,"|",G5,"|",G6,"|",G7) 

и сделать то же самое для остальных в том числе на колонке O

=CONCATENATE(O1,"|",O2,"|",O3,"|",O4,"|",O5,"|",O6,"|",O7) 

Затем сделать HLOOKUP

=HLOOKUP(O8,G8:L21,14,0) 

В моем случае время расчета сокращается с 10 минут до нескольких секунд!

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

формула в O21 согласно вашему образцу будет

=SUM(IF(CONCATENATE(G1:L1,G2:L2,G3:L3,G4:L4,G5:L5,G6:L6,G7:L7)=CONCATENATE(O1,O2,O3,O4,O5,O6,O7),G21:L21)) 

(я не добавлял в разделитель «|» для этой формулы, но это лучше сделать)

Но в конце я предпочитаю метод вспомогательной колонки.

Для справки

enter image description here

HTH

+0

Определенно попробуем попробовать и сообщит вам, как прошел тест скорости! –

+0

производительность увеличена с 17 ~ 25 секунд до менее 10 секунд. Спасибо –

+0

рад слышать это :) – Rosetta

1

Для повышения производительности reapeating избегают те же вычисления многократно.

Это позволяет нам отслеживать уникальный конкретный проект и извлекать его данные.

Если комбинация из 7 значений является уникальным, вычислить положение выбранного проекта только один раз в хелперов (например O15) с формулой массива (подтверждено Ctrl + Сдвиг + Enter:

=MATCH(1;(G1:L1=O1)*(G2:L2=O2)*(G3:L3=O3)*(G4:L4=O4)*(G5:L5=O5)*(G6:L6=O6)*(G7:L7=O7);0) 

Используйте следующую формулу в O21 и перетащить вниз:

=INDEX(G21:L21;1;$O$15) 
Смежные вопросы