Надеюсь, вы посмотрите здесь снова.
Я дам ответ, где VBA не требуется, и я постараюсь объяснить все до мелочей.
Используя картинку, которой вы поделились, я создал собственный лист:
Мы начинаем с F2
который является самым верхним элементом. Просто =A2
сделает это.
Здесь нечего объяснять.
На G2
появляется =IF(LEN(F2),INDEX(B:B,MATCH(F2,A:A,0)),"")
. Зная, что второй столбец всегда будет одинаковым с первым, он просто ищет точное соответствие F2
в диапазоне A:A
(MATCH
) и печатает все, что находится в B:B
в той же строке. (Он останавливается на первом найденном предмете, хотя это и не имеет значения, потому что он всегда такой же). LEN
запрещает показ #NA
если строка поиска пуста, а также пропускает вычисление всего массива.
В H2
приходит то, что вы предложили =IF(LEN(F2),SUMIF(A:A,F2,C:C),"")
. Он просто суммирует все значения в столбце C
которые имеют заданный критерий поиска в столбце A
LEN
такая же, как и в G2
но она не показывает ошибку, она выдает 0
. Тем не менее, вы все равно получите ноль, если есть термин, и сумма равна 0
.
Хотя вы можете просто заполнить G2
и H2
столько, сколько вам нужно, для F2
это не сработает. Но вы можете сделать это с помощью следующей формулы в F3
:
=IF(LEN(F2),IFERROR(INDEX(A:A,MATCH(1,(COUNTIF(F$2:F2,A$2:A$1000)=0)*(A$2:A$1000<>""),0)+1),""),"")
Это формула массива, которая должна быть подтверждена с помощью Ctrl+Shift+Enter.
Он начинается с COUNTIF
который просто возвращает двоичный массив, в то время как каждый элемент получает 1
если он соответствует какой-либо строке поиска, все остальные получают 0
(поиск всех строк над собой F$2:F2
). Поскольку мы не хотим получать уже использованный предмет, мы обращаем все 0
TRUE
(=0
). Нам также не нужен empty
элемент, поэтому мы тоже проверяем его (A$2:A$1000<>""
). Умножение двух логических массивов аналогично наличию AND
для каждой пары элементов, а при использовании действительного AND
проверяется, что все элементы в обоих массивах имеют значение TRUE
. Однако, умножение снова дает нам двоичный массив, имеющий 1
на каждый элемент, который не является пустым и не используется. MATCH
теперь проверяет первую 1
и возвращает ее номер позиции (строка). Но начиная со второго ряда мы получаем смещение, которое обнуляется с +1
. Имея позицию, INDEX
дает нам строку, которая нам нужна. IFERROR
только для первого empty
решения, которое вернуло бы #NA
. И LEN
просто пропускает вычисления для всех ячеек после первой пустой.
Использование мастера формул для просмотра того, что он действительно вычисляет, также помогает понять. Но всегда перепроверяйте все $
иначе автозаполнение может закончиться неудачей.
Если вам все еще нужно что-то спросить, просто напишите комментарий. :)