Excel - рекурсивный VLookup - PullRequest
       31

Excel - рекурсивный VLookup

3 голосов
/ 31 марта 2011

Недавно я узнал о Ctrl + Shift + Enter в формулах массива Excel и в настоящее время все еще изучаю их. Приходя к моей проблеме,

SheetA:
Product        Code
S1             19875
S2             19834
S1             13575
S1             35675
S2             47875   



SheetB:
Code           Indent
19875          40  
19834          15
13575          22
35675          25
47875          20

Мне нужно сделать сумму всех отступов для данного названия продукта.

Например: мне нужен общий отступ S1,

  • Vlookup на SheetA, получите код 19875
  • Выполнить просмотр на SheetB, получить отступ 40
  • Следующий просмотр на листе А, Получить код 13575
  • Используйте 13575 для Vlookup на SheetB, получите отступ 22 * ​​1015 *
  • Следующий просмотр на листе А, Получить код 35675
  • Используйте 35675 для Vlookup на SheetB, получите отступ 25
  • Сумма 40 + 22 + 25, возврат 87

Я могу добиться этого с помощью VBA, но мне интересно, возможно ли это в функциях Excel с использованием формул CSE / Array.

Edit:

У меня нет значений в Sheet2 в том же порядке, что и в Sheet1 .. Они абсолютно случайны. Мой SheetB будет выглядеть примерно так:

SheetB:
Code           Indent
19834          40  
19875          15
47875          22
13575          25
35675          20

Ответы [ 5 ]

7 голосов
/ 31 марта 2011
{=SUM(NOT(ISNA(MATCH((($A$2:$A$6="S1")*(B2:B6)),Sheet2!$A$2:$A$6,FALSE)))*(Sheet2!$B$2:$B$6))}

Первый аргумент MATCH разрешается в

{19875;0;13575;35675;0}

MATCH разрешается в

{1;#N/A;3;4;#N/A}

Вам нужно убедиться, что в нуле нет нулейSheetB.NOT ISNA превращает их в ИСТИНА и ЛОЖЬ и принимает значение

{TRUE;FALSE;TRUE;TRUE;FALSE}

. И окончательная сумма выглядит следующим образом

=SUM({TRUE;FALSE;TRUE;TRUE;FALSE}*{40;15;22;25;20})

Обновление

Я не могу найти решение с одним массивом, когда списки расположены в другом порядке.Мои попытки с OFFSET и TRANSPOSE либо дали неправильный ответ, либо разбили Excel.Если вы можете стоять, используя вспомогательный столбец, вы можете поместить эту формулу в третий столбец вашего первого листа

=VLOOKUP(B2,Sheet2!$A$2:$B$6,2,FALSE)

, а затем использовать эту формулу массива для суммирования их

{=SUM(($A$2:$A$6=A2)*($C$2:$C$6))}
0 голосов
/ 06 апреля 2011

Вы можете использовать следующее: //Ola.S

Таблица 1 Col: ABC Код продукта Intendent

Col C: = SUMIF ($ E $ 4: $ E $ 8; B4;$ F $ 4: $ F $ 8)

Таблица 2 Col: EF Code Intendent

Таблица 3 Сводная таблица (Col: A и C)

0 голосов
/ 04 апреля 2011

Не требуется вызовов TRANSPOSE.

Попробуйте формулу массива

= SUM (SUMIF (SheetB! A2: A6, IF (SheetA! A2: A6 = "S1", SheetA! B2: B6), SheetB! B2: B6))

при условии отсутствия ячейки в SheetB! A2: A6 оценивается как FALSE.И если бы все столбцы кода были числовыми (вероятно, сомнительное предположение), это можно было бы сделать без ввода массива, используя

= SUMPRODUCT (SUMIF (SheetB! A2: A6, SheetA! B2: B6 / (SheetA! A2): A6 = "S1"), SheetB! B2: B6))

при условии отсутствия ячейки в SheetB! A2: A6 оценивается как # DIV / 0!.

0 голосов
/ 04 апреля 2011

На листе C Если A1 имеет S1, то в ячейке B1 введите

=SUM((IF((Product=A1),Code1)=TRANSPOSE(Code2))*TRANSPOSE(Amt))

Массив введен Где Code1 = Динамический диапазон для кодов на ЛистеA, начиная с строки2 Code2 = Динамический диапазон для кодов на ЛистеB, начиная с строки2

0 голосов
/ 31 марта 2011

Если бы столбец Код был одинаковым (в одинаковом порядке) как для SheetA, так и для SheetB, то подойдет простая функция SUMIF. Аналогично, если бы данные INDENT были на SheetA, вы также можете использовать сводную таблицу для быстрого расчета сумм.

Полагаю, дизайн вашей рабочей книги этого не допустит. В этом случае у меня нет простых решений, но я посмотрю на это по-другому.

...