Массивы в функциях `AGGREGATE` и` INDEX` - PullRequest
1 голос
/ 02 июля 2019

Сценарий:

Итак, сегодня на работе мой компьютер запустил обновление MS Office.Затем, примерно через 30 минут, кто-то подошел ко мне с простой просьбой: вместо использования VLOOKUP для возврата только первого совпадения 1005 * они хотели получить список с разделителями all совпадений.(например, «какие офисы посетил этот пользователь на этой неделе»?) Выглядело достаточно просто.

Итак, работая с некоторыми нежелательными данными (см. ниже), я быстро написал следующую короткую демонстрационную строку:

=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B$1:B$11, AGGREGATE(15, 6, ROW(A$1:A$11)/--(A$1:A$11=E1), ROW(A$1:A$11))),""))

Нажмите Введите и ... 6.Не совсем то, что я ожидал (6, 35, 19, 56, 47), поэтому я говорю "извините за это", вернитесь в ячейку и нажмите Ctrl + Shift + Enter :

6, снова.

Итак, запустил «формулу оценки», и оказалось, что это ROW(A$1:A$11) в положении k (последний аргумент) AGGREGATE возвращал 1 вместо {1,2,3,4,5,6,7,8,9,10,11}, независимо от того, использовали ли вы нормальную формулу или формулу Array.

Итак, я набираю массив вручную:

=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B$1:B$11, AGGREGATE(15, 6, ROW(A$1:A$11)/--(A$1:A$11=E1), {1,2,3,4,5,6,7,8,9,10,11})),""))

Конечный результат: 6.Я снова оцениваю формулу, и AGGREGATE отбрасывает все, кроме первого значения из моего массива.Если я опускаю INDEX и просто запускаю TEXTJOIN для результатов AGGREGATE, все работает нормально.Точно так же =SUM(ROW(B1:B11)) работает нормально, а =SUM(INDEX(B1:B11, ROW(B1:B11), 1)) - нет.

Вопрос:

Теперь я 95% уверен , что раньше я могзаставить эти INDEX(.., AGGREGATE(..)) и SUM(INDEX(..)) работать должным образом, вместо того, чтобы возвращать только первое значение - это что-то изменило в том, как определенные цепочки функций работают с массивами, или я просто неправильно помню?

(Для тех, кто заинтересован, в итоге мы использовали формулу массива =TEXTJOIN(", ", TRUE, IF(A$1:A$11=E1, B$1:B$11, "")))

Нежелательные данные, использованные при тестировании:

A |  6
A | 35
A | 19
B | 33
B | 46
B | 72
A | 56
C | 41
C | 20
B | 52
A | 47

1 Ответ

2 голосов
/ 02 июля 2019

Хотя, как вы обнаружили, добавление IF вместо длинного INDEX / AGGREGATE работает.

Причина, по которой это не сработало, заключается в том, что INDEX обычно не настроен на использование массива в качестве номера строки.

Но мы можем заставить его использовать N(IF({1},...))

=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B$1:B$11, AGGREGATE(15, 6, ROW(A$1:A$11)/--(A$1:A$11=E1), N(IF({1},ROW(A$1:A$11))))),""))

Это формула массива, которая должна быть подтверждена с помощью Ctrl-Shift-Enter вместо Enter при выходе из режима редактирования.

enter image description here

Но опять же, это долгий путь, когда простой IF() сделает то, что нужно.

...