В вашем IF
предложение value_if_true
должно возвращать массив нужных номеров строк из массива.
MATCH
не возвращает массив значений; он возвращает только одно значение, которое с параметром FALSE
будет первым значением. Вот почему INDEX
возвращает только первое значение.
Один из способов вернуть массив значений:
Transactions[Category]=I12
вернет массив {TRUE,FALSE,FALSE,TRUE,...}
в зависимости от того, совпадает ли он.
Затем вы можете умножить его на номер строки, чтобы получить соответствующую строку на рабочем листе.
Поскольку вы используете таблицу, чтобы получить номер строки в массиве тела данных, у вас есть вычесть номер строки строки заголовка.
Но теперь у нас будет массив, включающий 0
для несоответствующих записей, что нам не подходит в качестве аргумента номера строки для функции INDEX
.
Таким образом, мы избавляемся от этого, используя функцию AGGREGATE
с аргументом ignore errors
, установленным после того, как мы изменим тест на равенство 1/(Transactions[Category]=I12)
, что создаст DIV/0
ошибки для несоответствующих.
Собираем все вместе
=SUM(INDEX(Transactions[Out],AGGREGATE(15,6,1/(Transactions[Category]=I12)*ROW(Transactions)-ROW(Transactions[#Headers]),ROW(INDIRECT("1:"&COUNTIF(Transactions[Category],$I$12))))))
Вам может потребоваться ввести это с помощью CSE в зависимости от вашей версии Excel.
Также, если у вас есть много этих формул, вы можете изменить Аргумент k
для AGGREGATE
для использования функции INDEX
(энергонезависимой) вместо функции INDIRECT
volatile.
=SUM(INDEX(Transactions[Out],AGGREGATE(15,6,1/(Transactions[Category]=I12)*ROW(Transactions)-ROW(Transactions[#Headers]),ROW(INDEX($A:$A,1,1):INDEX($A:$A,COUNTIF(Transactions[Category],$I$12),1)))))
Редактировать
Если у вас есть Excel / O365 с динамическими c массивами и функцией FILTER
, вы можете значительно упростить приведенное выше до обычно вводимого:
=SUM(FILTER(Transactions[Out],Transactions[Category]=I12))