РЕДАКТИРОВАТЬ: В недавнем ответе @ScottCraner использовалась формула INDEX()
отсутствующими ссылками, и его ответ заставил меня принять решение еще раз взяться за эту проблему. Тот же самый подход, который я пробовал (безуспешно), прежде чем работал отлично во второй раз Я опишу решение ниже.
Справочная информация о формуле INDEX(), на которую есть ссылки:
Шон, ты сделал замечательную попытку использовать формулы массива, чтобы сделать то, что тебе нужно. Ваши проблемы связаны с тем, как Excel обрабатывает массивы. Некоторые формулы могут использовать массивы в качестве аргументов, а некоторые нет.
Я немного покопался в этом и узнал некоторые очень странные, загадочные вещи об использовании массивов в формуле Excel INDEX()
, которых раньше не знал. Чтобы понять, как работает эта формула, давайте начнем с конца.
Самое последнее, что сделает ваша формула, - это сумма трех (прерывистых) значений из двумерного массива, который является вашей таблицей 2.
INDEX(array,row_num,col_num)
может возвращать одно значение из 2D-массива, а также может возвращать целый столбец или строку. Похоже, он должен иметь возможность вернуть список значений. Итак, давайте проверим это.
Эта формула (в идеальном мире) вернет сумму, которую вы ищете из таблицы 2:
=SUM(INDEX(G4:K8,{3,2,3},{5,4,3}))
Это должно добавить элементы из строки 3, столбца 5 плюс строки 2, столбца 4 плюс строки 3, столбца 3. Но это не так, он просто возвращает 1.67, на который ссылается первый элемент.
При поиске в Интернете создаются ссылки (в том числе здесь, в StackOverflow), в которых говорится, что INDEX()
вернет массив, но только если вы отмените ссылку на формулу (это "странная" часть). "Тайная" часть - как это сделать. Это формула с разыменованными ссылками:
=SUM(INDEX(G4:K8,N(IF(1,{3,2,3})),N(IF(1,{5,4,3}))))
Эта формула дает правильный ответ: 4.67.
В формуле IF()
обрабатывает 1 как True
, поэтому возвращает массив чисел, а N()
возвращает массив чисел, если они являются числами, которыми они являются. Почему IF() и N() требуются для правильной работы формулы, можно только догадываться. В формуле Скотта он должен был также умножить свой массив (это был диапазон) на 1.
Но теперь у нас есть формула, которая дает правильный ответ. И, надеюсь, все, что нам нужно сделать, это заменить константы массива на вычисленные массивы, используя другие ваши данные.
Новая информация начинается здесь.
Для чисел row_num в формуле выше {3,2,3}
нам нужны позиции процентных интенсивностей в F4:F8, связанных с выбранными сортами фруктов. Во-первых, мы получим массив позиций яблок в G12:G16
вашей таблицы 3:
=MATCH(B3:B5,G12:G16,0)
Это формула массива и должна вводиться с помощью клавиши CTRL Shift Enter, а не просто Enter.
Эта формула ищет список сортов яблок из таблицы 1 в столбце G таблицы 3 и возвращает массив их позиций.
Если вы выберете формулу в строке формул и нажмете F9, вы увидите, что значением формулы является массив {1,3,4}
, позиции яблок в столбце G таблицы 3.
Теперь нам нужны PI, связанные с этими позициями. Эта формула INDEX()
выглядит в столбце H и использует вышеуказанный массив как row_num. Здесь row_num должны быть "разыменованы":
=INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0))))
Эта формула возвращает массив {0.97,0.98,0.97}
, PI's яблок. Все идет нормально. Затем мы используем этот массив в качестве значений поиска в формуле MATCH()
которая выглядит как F4:F8, индекс PI вашей таблицы 2:
=MATCH(INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0)))),F4:F8,0)
Эта формула возвращает массив {3,2,3}
, и это те, которые необходимы row_num для окончательной формулы.
Далее нам нужно col_num's {5,4,3}
, то есть общее количество фруктов для каждого из сортов яблок. Мы получим это из таблицы 3, но сначала нам нужно рассчитать общее количество фруктов для всех сортов фруктов. Этот (рассчитанный) массив представляет собой список этих итогов:
(I12:I16*J12:J16)+K12:K16
Чтобы получить общее количество фруктов для сортов Apple, мы будем использовать этот массив в INDEX()
с теми же (без ссылки) row_num, что и раньше:
=INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(B3:B5,G12:G16,0))))
Эта формула возвращает массив {5,4,3}
, и это столбец col_num, необходимый для окончательной формулы.
Собирая все это вместе, список NFPI:
=INDEX(G4:K8,MATCH(INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0)))),F4:F8,0),INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(B3:B5,G12:G16,0))))
Эта формула возвращает массив {1.67;2;1}
. Это NFPI для яблок, и теперь нам нужно просто добавить их.
Но еще не совсем, есть небольшая проблема, о которой нужно позаботиться в первую очередь. Все три сорта яблок можно найти в таблице 3, но это не относится к апельсинам. Приведенные выше формулы возвращают массивы с #N/A
в которых сорт Small Orange не может быть найден. Это не вызывает никаких проблем, пока не придет время сложить значения.
Поэтому, прежде чем взять сумму, мы конвертируем #N/A's
в 0 с помощью IFERROR()
. Вот последняя формула:
=SUM(IFERROR(INDEX(G4:K8,MATCH(INDEX(H12:H16,N(IF(1,MATCH(C3:C5,G12:G16,0)))),F4:F8,0),INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(C3:C5,G12:G16,0))))),0))
Эта формула возвращает 4,67 для яблок и 5,75 для апельсинов.
Шон, надеюсь, это все еще может быть полезным. Извините за долгую задержку.