В Numbers / Excel, как я могу сделать SUMPRODUCT только для строк, соответствующих определенным критериям - PullRequest
0 голосов
/ 13 января 2019

Позвольте мне немного объяснить мою таблицу. Вот хороший скриншот этого:

enter image description here

Я создал эту таблицу в основном потому, что устал от проблем с юзабилити практически всех приложений для отслеживания питания. Поэтому я создаю свою собственную таблицу! Как вы можете видеть, в горизонтальной плоскости находятся различные продукты / ингредиенты, а ниже приведены значения фактических данных о питании.

Тогда вы увидите, что внизу есть строка с названием «первая еда» с некоторыми значениями. По сути, это я говорю «2,5 порции квиноа, 2 порции чечевицы» и т. Д. Эта информация затем показана в таблице ниже, где «Первая еда» слева. *

Моя цель сейчас - учесть две вещи.

  1. Многоразовое питание
  2. блюда из других блюд
    • (Представьте, что есть ряды "Завтрак с углеводами", "Обед с жиром", "Белковый ужин", и каждый из них представлял собой столы с едой, но я хотел объединить их в одном столике под названием "Завтрак с углеводами, жирный обед, ужин с белком")

У меня возникли трудности с этим, и, по сути, все сводится к формуле для строки D на таблице "первого приема пищи". Формула для него в настоящее время SUMPRODUCT(Row Fat, Row First Meal) и, как вы можете себе представить, SUMPRODUCT(Row Cholestrol, Row First Meal). Это хорошо работает для одного приема пищи, но это просто много работы для настройки на несколько приемов пищи и не работает для многократного приема пищи.

Цель состоит в том, чтобы значение каждой ячейки в столбце D по существу определялось следующей формулой.

nutrient = // whatever row we are on
integer sum = 0;
foreach(row in top table):
    integer weight = [ammount of the 'nutrient' in this row]
    integer innersum = 0;
    foreach(meal in meals):
        if (meal is contained in string top left corner of this table):
            innersum += [number of servings of this row];
        sum += innersum * weight;

Это действительно самый ясный способ объяснить эту формулу. По существу, для каждого элемента питания посмотрите на верхнюю левую ячейку вашего стола и получите сумму порций для этого элемента питания на основе этой строки, а затем умножьте ее на количество правильного питательного вещества в еде.

В идеале эта формула для значения в ячейке D должна быть реализована следующим образом:

Возьмите матрицу всех блюд из верхней таблицы и отфильтруйте строки с именами, которые не содержатся в вашем верхнем левом столбце. Затем упростите эту матрицу в одну строку, сложив все элементы в столбце. Затем сделайте sumproduct с этим значением и количеством конкретных питательных веществ из фактов питания пищи. Проблема в том, что я не знаю, как сделать весь матричный фильтр и упростить работу. Честно говоря, я не знаю, работают ли электронные таблицы именно так.

* Не волнуйтесь, я разработал эту еду с учетом полного дня еды.

1 Ответ

0 голосов
/ 14 января 2019

Это довольно длинная формула, потому что вам нужно сделать несколько вещей:

(1) Найти заголовок для текущего блока результатов

INDEX(A:A,INT(ROW()/10)*10+1)

(2) Найдите, какие строки совпадают в списке блюд

ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30)....

(3) Построить массив на основе этих совпадающих строк

 ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30),INDEX(A:A,INT(ROW()/10)*10+1)))*Sheet1!B$20:H$30

(4) Получить итоговые значения столбца этого массива

MMULT(TRANSPOSE(ROW(Sheet1!B$20:H$30))^0,ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30),INDEX(A:A,INT(ROW()/10)*10+1)))*Sheet1!B$20:H$30)

(5) Найдите правильный ряд в таблице питательных веществ

INDEX(Sheet1!B$2:H$9,MOD(ROW()-1,10),0)

Тогда соберите все это вместе

=SUM(MMULT(TRANSPOSE(ROW(Sheet1!B$20:H$30))^0,ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30),
INDEX(A:A,INT(ROW()/10)*10+1)))*Sheet1!B$20:H$30)*INDEX(Sheet1!B$2:H$9,MOD(ROW()-1,10),0))

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

Я предполагаю, что Sheet2 организован в блоки из 9 строк плюс пустую строку, то есть всего 10 строк на блок.

Лист1

enter image description here

Лист2

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...