Вот один из подходов к созданию динамических списков вещей в Excel.
Предположим, у вас есть массив номеров строк, где ваши критерии имеют значение TRUE (т. Е. Код покупателя = JDH и остаток> 0). Затем вы можете передать этот массив в функцию SMALL() которая будет перечислять номера строк по мере их заполнения. И, наконец, вы можете использовать SMALL() в качестве row_nums в функции INDEX() , и в этом списке будут перечислены соответствующие значения любого столбца, который вы указываете с помощью параметра column_num .
Итак, начнем с получения массива номеров строк. Для простоты я предполагаю, что ваша таблица данных имеет только 25 строк, и что панель инструментов находится на том же листе, что и данные. Также я использую код покупателя ELN, который находится в ячейке B30.
Сначала мы рассчитаем массив значений TRUE/FALSE соответствующих вашим критериям:
($C$1:$C$25=$B$30)*($G$1:$G$25>0)
Первое выражение дает массив значений TRUE/FALSE где код покупателя (столбец C) = ELN, а второе - массив значений TRUE/FALSE где Remaining (столбец G)> 0. В арифметических операциях, включающих логические значения, TRUE и FALSE преобразуются в 1 и 0, поэтому это умножение дает массив из 1 и 0 с 1 в позициях, где ваши критерии оба TRUE .
Теперь нам нужно преобразовать этот массив в список номеров строк, где ваши критерии имеют значение TRUE . Если мы разделим массив последовательных чисел на этот массив 1 и 0, мы получим массив номеров строк, где есть 1, с вкраплениями #DIV/0! ошибки везде, где есть 0.
ROW($1:$25)/(($C$1:$C$25=$B$30)*($G$1:$G$25>0))
Далее, вместо SMALL() , мы будем использовать AGGREGATE() , которая делает то же самое, что SMALL() , (function = 15), за исключением того, что она имеет возможность игнорировать ошибки (option = 6). Также AGGREGATE() может обрабатывать массивы, не вводя их с помощью CTRL Shift Enter.
Таким образом, в приведенной ниже формуле AGGREGATE() игнорирует #DIV/0! ошибки, и дает массив, содержащий только номера строк, которые соответствуют вашим критериям:
AGGREGATE(15,6,ROW($1:$25)/(($C$1:$C$25=$B$30)*($G$1:$G$25>0)),ROW()-33)
У меня есть эта формула в строке 34, поэтому «-33» заставляет функцию начинаться с 1 и перечисляет номера строк по мере заполнения. Измените этот параметр в соответствии с вашей ситуацией.
Теперь мы можем использовать это в INDEX() и обернуть все это в IFERROR() для вставки пробелов, когда INDEX() исчерпывает row_nums мере заполнения. Эта формула, заполненная справа от B34:
=IFERROR(INDEX($A$1:G$25,AGGREGATE(15,6,ROW($1:$25)/(($C$1:$C$25=$B$30)*($G$1:$G$25>0)),ROW()-33),MATCH(B$32,$A$1:$G$1,0)),"")
дает результаты, показанные ниже.

Для ELN покупателя только строки 5 и 11 имеют 0 оставшихся, а в формуле перечислены все строки, кроме этих.
Обратите внимание, что я ссылался на заголовки инструментальной панели в MATCH() которая дает column_num's используя B$32 в качестве lookup_value . Когда формула заполнена, это работает для номера заказа и описания, но другие заголовки в панели мониторинга не совпадают с заголовками в вашей таблице данных.
Поэтому для других столбцов я заменил ссылку на ячейку B$32 текстом в кавычках: "LINE_NBR" для столбца PO Line, "QUANTITY" для столбца Qty Ordered и "REMAINING" для столбца Qty Received. Этот последний столбец включает в себя вычисления, поэтому формула на самом деле:
=E34-IFERROR(INDEX($A$1:G$25,AGGREGATE(15,6,ROW($1:$25)/(($C$1:$C$25=$B$30)*($G$1:$G$25>0)),ROW()-33),MATCH("REMAINING",$A$1:$G$1,0)),"")
Последний столбец "Необходим" рассчитывается как:
=E34-F34 и заполнены.
Надеюсь, это поможет, и удачи.