Формула Excel для суммирования массива элементов из списка поиска - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь сделать свою ежемесячную электронную таблицу транзакций менее трудоемкой, но сталкиваюсь с проблемами при выводе поисков по категориям в виде массива. Сейчас у меня есть таблица со всеми моими ежемесячными транзакциями, и я хочу создать другую таблицу с ежемесячными промежуточными итогами. Что я делал, так это вручную суммировал каждую запись из каждой категории, но я бы хотел автоматизировать процесс. Вот что у меня есть:

=SUM(INDEX(Transactions[Out], N(IF(1,MATCH(I12,Transactions[Category],FALSE)))))

Я также пытался использовать AGGREGATE вместо SUM, но он по-прежнему возвращает только первое значение в категории. N(IF()) должен был заставить INDEX возвращать все совпадения в виде массива, но он не работает. Я нашел этот трюк онлайн, без объяснения того, почему он работает, поэтому я действительно не знаю, как это исправить. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

На тот случай, если кто-нибудь когда-нибудь взглянет на эту ветку в будущем, я смог найти более простое решение своей проблемы после того, как внедрил метод Transactions[Category]=I12. SUM, сам примет массив в качестве аргумента, поэтому все, что мне нужно было сделать, это сформировать массив значений, которые я хотел бы сохранить в диапазоне Transactions[Out]. Я сделал это, настроив метод Рона, описанный выше, но вместо использования 1/(Transactions[Category]=I12 я использовал 1/IF(Transactions[Category]=I12, 1,1000) и окружил его FLOOR(*resulting array*, .01), который округлил все тысячные до нуля и не дал никаких ошибок #DIV/0!.

Тогда! Я понял, что самый простой способ получить реальные цифры, которые я хотел, вместо того, чтобы связываться с INDEX или AGGREGATE, - это умножить диапазон Transactions[Out] на двоичный массив из теста IF. Поскольку диапазон представляет собой таблицу, я знаю, что они всегда будут одинакового размера. И SUM автоматически умножает элемент на элемент, а затем добавляет для операций, подобных этой.

(В результате получается формула "CSE", которая, я думаю, не всем нравится. Я до сих пор не уверен на 100% о том, что это значит: только то, что он выводит данные в одной ячейке, а не в нескольких ячейках. Но в этом контексте SUM должен выводить только одно число, поэтому я не уверен, зачем мне нужен CSE ... A проблема на другой день!)

0 голосов
/ 04 марта 2020

В вашем 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...