Формула индекса массива Excel медленная - PullRequest
0 голосов
/ 12 мая 2019

У меня есть числа, случайно расположенные в столбце:

enter image description here

Я хочу сгруппировать все числа вместе в новом столбце.Я использую следующую формулу массива:

{= INDEX ($ B: $ B, МАЛЕНЬКИЙ (ЕСЛИ (ISNUMBER ($ B: $ B), ROW ($ B: $ B) -MIN (ROW ($ B: $ B)) + 1, ""), ROWS (ZZ2: $ ZZ $ 2)))}

Но у меня есть 500 таких чисел в столбце источника.Это делает обработку формулы очень медленной.Как я могу сделать это быстрее?

1 Ответ

0 голосов
/ 12 мая 2019

Как упомянуто в комментарии, любая формула, введенная как формула массива или любая формула, использующая функцию, включающую циклические вычисления (например, SUMPRODUCT, некоторые варианты AGGREGATE и т. Д.), Не должна использовать полные ссылки на столбцы.Циклический расчет с 10 строками составляет 100 вычислений;1000 строк составляет 1 миллион вычислений.Если вы выполните математику для 1048 576 строк, а затем вычислите ненужные вычисления, выполненные для пустых ячеек, вы быстро увидите потраченные впустую вычислительные циклы, которые переводятся в «задержку вычисления».

Таким образом, вместо использования B:B, вы можетеначать с B1 в качестве верхней ячейки в столбце B: B.Строка с последним номером в столбце B: B может быть получена с помощью

MATCH(1E99, B:B)

. Таким образом, вы можете найти последнюю ячейку в столбце B: B с номером, указав в столбце B: B INDEXing и используя MATCH длянайдите номер строки.

INDEX(B:B, MATCH(1E99, B:B))

Чтобы получить диапазон, просто объедините их двоеточием.

B1:INDEX(B:B, MATCH(1E99, B:B))
'if you are starting your data at a significantly different row than row 1 then this would be better where you can easily set the starting row
INDEX(B:B, 1):INDEX(B:B, MATCH(1E99, B:B))

Я предпочитаю подфункцию SMGR в AGGREGATE, а в массив вводится SMALL (IF ..поэтому моя версия вашей формулы будет выглядеть следующим образом:

=INDEX(B:B, AGGREGATE(15, 6, ROW(INDEX(B:B, 1):INDEX(B:B, MATCH(1E+99, B:B)))/SIGN(LEN(INDEX(B:B, 1):INDEX(B:B, MATCH(1E+99, B:B)))), ROW(1:1)))

Это может показаться более сложным, но это уменьшит задержку расчета до минимума.

...