Как подтянуть несколько значений по одной позиции в excel

Skip to content

Поиск ВПР нескольких значений по нескольким условиям

В статье показаны способы поиска (ВПР) нескольких значений в Excel на основе одного или нескольких условий и возврата нескольких результатов в столбце, строке или в отдельной ячейке.

При использовании Microsoft Excel для анализа данных вы часто можете оказаться в ситуации, когда вам нужно получить все совпадающие значения для определенного имени, наименования, артикула или какого-либо другого уникального идентификатора. Первое решение, которое приходит на ум, — это использование функции Excel ВПР (VLOOKUP). Но проблема в том, что она может возвращать только одно значение.

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

Поиск нескольких позиций в Excel с помощью формулы

Как было сказано ранее, невозможно заставить функцию ВПР Excel возвращать несколько значений. Проблему можно решить, используя следующие функции в формуле массива:

  • ЕСЛИ – оценивает условие и возвращает одно значение, если условие выполняется, и другое значение, если условие не выполняется.
  • НАИМЕНЬШИЙ– получает N-е наименьшее значение в массиве.
  • ИНДЕКС — возвращает элемент массива на основе указанных вами номеров строк и столбцов.
  • СТРОКА — возвращает номер строки.
  • СТОЛБЕЦ — возвращает номер столбца.
  • ЕСЛИОШИБКА – перехватывает ошибки.

Ниже вы найдете несколько примеров таких формул. Их часто называют формулами ВПР нескольких значений, хотя сама функция ВПР здесь не используется. Дело в том, что часто под термином ВПР подразумевают любой поиск в Excel, какими бы формулами и функциями он ни осуществлялся.

Поиск нескольких значений и возврат результатов в столбец

Допустим, у вас есть имена продавцов в столбце А и товары, которые они продали, в столбце В. Таблица содержит несколько записей для каждого продавца. Ваша цель — получить список всех товаров, относящихся к данному человеку. Чтобы это сделать, выполните следующие действия:

  1. Введите список имен продавцов в какую-нибудь пустую строку того же или другого рабочего листа. В этом примере имена вводятся в ячейки D2:H2:

СоветЧтобы быстро записать все имеющиеся в списке имена, вы можете использовать эту инструкцию —  как получить список уникальных значений в Excel.

  1. Под именем выберите количество пустых ячеек, равное или превышающее максимально возможное количество совпадений, введите одно из следующих выражений и нажмите Ctrl + Shift + Enter для ввода его как формулы массива (в этом случае вы сможете редактировать формулу только сразу во всем диапазоне, где она введена). Или же вы можете записать это в левую верхнюю ячейку, также использовав Ctrl + Shift + Enter, а затем перетащить вниз еще на несколько ячеек (в этом случае вы сможете редактировать формулу в каждой ячейке отдельно).

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13; НАИМЕНЬШИЙ(ЕСЛИ(D$2=$A$3:$A$13; СТРОКА($B$3:$B$13)-2;»»); СТРОКА()-2));»»)

или

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13;НАИМЕНЬШИЙ(ЕСЛИ(D$2=$A$3:$A$13;СТРОКА($A$3:$A$13)-МИН(СТРОКА($A$3:$A$13))+1;»»); СТРОКА()-2));»»)

Как видите,  первая формула немного компактнее, а вторая более универсальна и требует меньше модификаций (подробнее о синтаксисе и логике мы поговорим чуть дальше).

  1. Скопируйте формулу в соседние столбцы справа. Для этого перетащите маркер заполнения (небольшой квадрат в правом нижнем углу выбранного диапазона) вправо.

Результат ВПР нескольких значений в столбце будет выглядеть примерно так:

Здесь мы использовали первую формулу:

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13; НАИМЕНЬШИЙ(ЕСЛИ(D$2=$A$3:$A$13; СТРОКА($B$3:$B$13)-2;»»); СТРОКА()-2));»»)

Как это работает.

Это пример использования Excel от среднего до продвинутого уровня, который подразумевает базовые знания формул массива и функций Excel. Итак, разберём пошагово:

  1. Функция ЕСЛИ

В основе поиска – функция ЕСЛИ, чтобы получить позиции всех вхождений искомого значения в диапазоне поиска: ЕСЛИ(D$2=$A$3:$A$13; СТРОКА($B$3:$B$13) )-2;»»)

ЕСЛИ сравнивает искомое значение (D2) с каждым значением в диапазоне поиска (A3:A13) и, если совпадение найдено, возвращает относительную позицию строки; пустое значение («») в противном случае.

Относительная позиция вычисляется путем вычитания 2 из СТРОКА($B$3:$B$13), чтобы первая позиция с формулой имела порядковый номер 1 (то есть, 3-2=1). Если ваш диапазон вывода начинается со строки 2, тогда вычтите 1 и так далее. Результатом этой операции является массив {1;2;3;4;5;6;7;8;9;10;11}, который поступает в аргумент значение_если_истина функции ЕСЛИ.

Вместо приведенного выше вычисления вы можете использовать следующее выражение:

СТРОКА(столбец_просмотра) — МИН(СТРОКА(столбец_просмотра))+1

Оно возвращает тот же результат, но не требует каких-либо изменений независимо от местоположения возвращаемого столбца. В этом примере это будет СТРОКА($A$3:$A$13)-МИН(СТРОКА($A$3:$A$13))+1.

Итак, на данный момент у вас есть массив, состоящий из чисел (позиций совпадений) и пустых строк (несовпадений). Для ячейки D3 в этом примере у нас есть следующий массив:

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13; НАИМЕНЬШИЙ({1:»»:»»:»»:5:»»:»»:8:»»:»»:»»}; СТРОКА()-2));»»)

Если вы сверитесь с исходными данными, вы увидите, что «Сергей» (значение поиска в D2) появляется на 1- й , 5 -й и 8 -й позициях в диапазоне поиска (A3: A13).

  1. Функция НАИМЕНЬШИЙ

Затем вступает в действие функция НАИМЕНЬШИЙ(массив; k), чтобы определить, какие совпадения должны быть возвращены в конкретной ячейке.

С уже установленным в предыдущем шаге массивом давайте определим аргумент k , т. е. k-е наименьшее возвращаемое значение. Для этого вы делаете своего рода «инкрементный счетчик» СТРОКА()-n, где «n» — это номер строки первой ячейки формулы минус 1. В этом примере мы ввели формулу в ячейки D3:D7, поэтому СТРОКА()-2 возвращает «1» для ячейки D3 (строка 3 минус 2), «2» для ячейки D4 (строка 4 минус 2) и т. д.

В результате функция НАИМЕНЬШИЙ извлекает первый наименьший элемент массива в ячейку D3, второй наименьший элемент в ячейку D4 и так далее. И это превращает первоначальную длинную и сложную формулу в очень простую, например:

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13;{1});»»)

СоветЧтобы увидеть значение, вычисленное определенной частью формулы, выделите эту часть в самой формуле и нажмите F9.

  1. Функция ИНДЕКС

Здесь все просто. Вы используете функцию ИНДЕКС, чтобы вернуть значение элемента массива на основе его номера.

  1. Функция ЕСЛИОШИБКА 

И, наконец, вы оборачиваете формулу в функцию ЕСЛИОШИБКА для обработки возможных ошибок, которые неизбежны, потому что вы не можете знать, сколько совпадений будет возвращено для того или иного искомого значения. Ведь вы копируете формулу в число ячеек явно большее, чем количество возможных совпадений, то есть «с запасом». Чтобы не пугать пользователей кучей ошибок, просто замените их пустой строкой (пустой ячейкой).

Примечание. Обратите внимание на правильное использование абсолютных и относительных ссылок на ячейки в формуле. Все ссылки фиксированы, за исключением ссылки на относительный столбец в искомом значении (D$2), которая должна изменяться в зависимости от относительного положения столбцов, в которые копируется формула, чтобы возвращать совпадения для других имён.

На скриншоте ниже вы можете видеть, как работает вторая формула

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13;НАИМЕНЬШИЙ(ЕСЛИ(D$2=$A$3:$A$13;СТРОКА($A$3:$A$13)-МИН(СТРОКА($A$3:$A$13))+1;»»); СТРОКА()-2));»»)

Обобщив эти два решения, мы получим следующие общие формулы для ВПР нескольких значений в Excel, которые будут выведены в столбец:

Вариант 1 :

=ЕСЛИОШИБКА(ИНДЕКС(диапазон_возвращаемых_значений; НАИМЕНЬШИЙ(ЕСЛИ(искомое_значение = диапазон_искомых_значений; СТРОКА(диапазон_возвращаемых_значений)-m;»»); СТРОКА()-n));»»)

Вариант 2:

=ЕСЛИОШИБКА(ИНДЕКС(диапазон_возвращаемых_значений;НАИМЕНЬШИЙ(ЕСЛИ(искомое_значение = диапазон_искомых_значений;СТРОКА(диапазон_искомых_значений)-МИН(СТРОКА(диапазон_искомых_значений))+1;»»); СТРОКА()-n));»»)

где:

  • m — номер строки первой ячейки в возвращаемом диапазоне минус 1.
  • n — номер строки первой ячейки с формулой минус 1.

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

Поиск нескольких совпадений и возврат результатов в строке

Если вы хотите вернуть несколько найденных значений в строках, а не в столбцах, измените приведенные выше формулы Excel следующим образом:

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13; НАИМЕНЬШИЙ(ЕСЛИ($D3=$A$3:$A$13;СТРОКА($B$3:$B$13)-2;»»); СТОЛБЕЦ()-4));»»)

или

=ЕСЛИОШИБКА(ИНДЕКС($B$3:$B$13;НАИМЕНЬШИЙ(ЕСЛИ($D3=$A$3:$A$13;СТРОКА($A$3:$A$13)-МИН(СТРОКА($A$3:$A$13))+1;»»);СТОЛБЕЦ()-4)); «»)

Как и в предыдущем примере, обе они являются формулами массива, поэтому не забудьте нажать комбинацию Ctrl + Shift + Enter, чтобы записать их правильно.

Формулы работают с той же логикой, что и в предыдущем примере, за исключением того, что вы используете функцию СТОЛБЕЦ вместо СТРОКА. Чтобы определить, какое совпадающее значение должно быть возвращено в конкретной ячейке, используем: СТОЛБЕЦ()-n где n — номер столбца первой ячейки, в которую вводится формула, минус 1. В этом примере результаты выводятся в диапазон E2:H2. Поскольку E является пятым столбцом, n равно 4  (5-1=4).

Примечание. Чтобы формула правильно копировалась вправо и вниз, обратите внимание на ссылки на значения поиска, где используется абсолютный адрес столбца и относительный адрес строки, например $D3.

И вот общие формулы для ВПР в Excel нескольких значений, возвращаемых по строке:

Формула 1 :

=ЕСЛИОШИБКА(ИНДЕКС(диапазон_возвращаемых_значений; НАИМЕНЬШИЙ(ЕСЛИ(искомое_значение = диапазон_искомых_значений; СТРОКА(диапазон_возвращаемых_значений)-m;»»); СТОЛБЕЦ()-n));»»)

Формула 2:

=ЕСЛИОШИБКА(ИНДЕКС(диапазон_возвращаемых_значений;НАИМЕНЬШИЙ(ЕСЛИ(искомое_значение = диапазон_искомых_значений;СТРОКА(диапазон_искомых_значений)-МИН(СТРОКА(диапазон_искомых_значений))+1;»»); СТОЛБЕЦ()-n));»»)

где:

  • m — номер строки первой ячейки в возвращаемом диапазоне, минус 1.
  • n — номер столбца первой ячейки, в которой записана формула, минус 1.

Поиск нескольких значений на основе нескольких условий

Вы уже знаете, как выполнять поиск нескольких значений в Excel на основе одного условия. Но что, если вы хотите вернуть несколько совпадений сразу на основе двух или более критериев? Продолжая предыдущие примеры – что, если у вас в таблице есть дополнительный столбец «Месяц» и вы хотите получить список всех товаров, проданных конкретным продавцом в определенном месяце?

Если вы знакомы с формулами массивов, то, возможно, помните, что они позволяют использовать знак умножения (*) в качестве логического оператора И. Таким образом, вы можете просто взять выражения, рассмотренные в двух предыдущих примерах, и заставить их проверять несколько условий, как показано ниже.

Как вернуть несколько значений в столбце.

Выведем искомые значения, соответствующие одновременно нескольким условиям, в привычном нам виде – вертикально в одном столбце.

В общем виде это выглядит так:

=ЕСЛИОШИБКА(ИНДЕКС(диапазон_возвращаемых_значений; НАИМЕНЬШИЙ(ЕСЛИ(1=((—(искомое_значение1 = диапазон_искомых_значений1)) * (—(искомое_значение2 = диапазон_искомых_значений2))) ; СТРОКА(диапазон_возвращаемых_значений)-m;»»); СТРОКА()-n));»»)

где:

  • m — номер строки первой ячейки в возвращаемом диапазоне, минус 1.
  • n — номер строки первой слева ячейки с формулой, минус 1.

Предположим, что список продавцов (диапазон_искомых_значений1) находится в A3:A30, список месяцев (диапазон_искомых_значений2) находится в B3: B30, интересующий продавец (искомое_значение1) указан в ячейке E3, а нужный месяц (искомое_значение2) – в ячейке F3. Тогда формула поиска принимает следующий вид:

=ЕСЛИОШИБКА(ИНДЕКС($C$3:$C$30; НАИМЕНЬШИЙ(ЕСЛИ(1=((—($E$3=$A$3:$A$30))*(—($F$3=$B$3:$B$30))); СТРОКА($C$3:$C$30)-2;»»); СТРОКА()-2));»»)

Таким образом, мы вводим имя в E3, месяц в F3, и получаем список товаров в столбце G:

Как вернуть несколько результатов в строке.

Если вы хотите получить по горизонтали несколько искомых значений на основе нескольких критериев, то есть когда результаты размещаются в одной строке, то используйте следующий общий шаблон:

=ЕСЛИОШИБКА(ИНДЕКС(диапазон_возвращаемых_значений; НАИМЕНЬШИЙ(ЕСЛИ(1=((—(искомое_значение1 = диапазон_искомых_значений1)) * (—(искомое_значение2 = диапазон_искомых_значений2))) ; СТРОКА(диапазон_возвращаемых_значений)-m;»»); СТОЛБЕЦ()-n));»»)

где:

  • m — номер строки первой ячейки в возвращаемом диапазоне, минус 1.
  • n — номер столбца первой слева ячейки, в которой записана формула, минус 1.

Для нашего примера набора данных формула выглядит следующим образом:

=ЕСЛИОШИБКА(ИНДЕКС($C$3:$C$30; НАИМЕНЬШИЙ(ЕСЛИ(1=((—($E3=$A$3:$A$30))*(—($F3=$B$3:$B$30))); СТРОКА($C$3:$C$30)-2;»»); СТОЛБЕЦ()-6));»»)

И результат ВПР нескольких значений по нескольким условиям может выглядеть так:

Аналогичным образом вы можете выполнять ВПР с тремя, четырьмя и более условиями.

Как это работает?

По сути, формулы для ВПР нескольких значений с несколькими условиями работают с уже знакомой логикой, объясненной в самом первом нашем примере. Единственное отличие состоит в том, что функция ЕСЛИ теперь проверяет несколько условий:

1=((—(искомое_значение1 = диапазон_искомых_значений1)) * (—(искомое_значение2 = диапазон_искомых_значений2)) * …..)

Результатом каждого сравнения (искомое_значение = диапазон_искомых_значений) является массив логических значений ИСТИНА (условие выполнено) и ЛОЖЬ (условие не выполнено). Двойное отрицание (—) переводит логические значения в единицы и нули. А поскольку умножение на ноль всегда дает ноль, в правой части этого равенства у вас будет получаться 1 только для тех элементов, которые удовлетворяют всем указанным вами условиям. 

Вы просто сравниваете окончательный массив нулей и единиц с числом 1, чтобы функция СТРОКА вернула порядковые номера строк, удовлетворяющих всем условиям, в противном случае — пустоту.

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

Как вернуть несколько значений ВПР в одну ячейку

Мы продолжаем работать с набором данных, который использовали в предыдущем примере. Но на этот раз мы хотим добиться другого результата — вместо того, чтобы извлекать несколько совпадений в отдельные ячейки, мы хотим, чтобы они отображались в одной текстовой ячейке, разделенные запятой, пробелом или другим разделителем по вашему выбору.

Используем выражение, которое мы рассматривали чуть выше и которая позволяет получить несколько результатов ВПР с условиями в одной строке:

=ЕСЛИОШИБКА(ИНДЕКС($C$3:$C$30; НАИМЕНЬШИЙ(ЕСЛИ(1=((—($E3=$A$3:$A$30))*(—($F3=$B$3:$B$30))); СТРОКА($C$3:$C$30)-2;»»); СТОЛБЕЦ()-6));»»)

Внесем в нее небольшие изменения.

Чтобы обработать сразу несколько результатов, в функцию СТОЛБЕЦ добавим аргумент – диапазон ячеек, в который мы ранее копировали формулу. То есть, вместо СТОЛБЕЦ() у нас теперь будет СТОЛБЕЦ(G3:K3). Это позволит формуле массива получить сразу несколько номеров столбцов.

Затем применим крайне полезную при работе с текстовыми значениями функцию ОБЪЕДИНИТЬ (доступна в Excel 2019 и более поздних версиях). Она позволит нам объединить несколько текстовых значений, отделив их друг от друга выбранным нами разделителем. К примеру, запятой с пробелом после нее.

Вот что у нас получится:

=ОБЪЕДИНИТЬ(«, «; ИСТИНА; ЕСЛИОШИБКА(ИНДЕКС($C$3:$C$30; НАИМЕНЬШИЙ(ЕСЛИ(1=((—($E3=$A$3:$A$30))*(—($F3=$B$3:$B$30))); СТРОКА($C$3:$C$30)-2;»»); СТОЛБЕЦ(G3:K3)-6));»»))

И видим результат ВПР нескольких значений в одной ячейке на этом скриншоте:

Еще один, более простой вариант, чтобы подтянуть несколько значений и вывести результат в одной ячейке:

=ОБЪЕДИНИТЬ(«, «;ИСТИНА;ЕСЛИ(($A$3:$A$30=E3)*($B$3:$B$30=F3)=1;$C$3:$C$30;»»))

Ее также нужно вводить как формулу массива:

Как найти несколько значений без дубликатов

А если так случится, что в результатах поиска будет несколько одинаковых значений? Пример таких данных вы можете видеть на скриншоте ниже. Естественно, выводить в ячейке несколько дубликатов было бы не совсем хорошо.

Если вы хотите получить в одной ячейке результаты поиска нескольких значений без повторов, попробуйте так:

=ОБЪЕДИНИТЬ(«, «; ИСТИНА; ЕСЛИ(ЕСЛИОШИБКА(ПОИСКПОЗ($C$3:$C$13; ЕСЛИ(E3=$A$3:$A$13; $C$3:$C$13; «»); 0);»»)=ПОИСКПОЗ(СТРОКА($C$3:$C$13); СТРОКА($C$3:$C$13)); $C$3:$C$13; «»))

Вставьте это выражение в нужную ячейку, не забыв завершить ввод комбинацией Ctrl+Shift+Enter, так как это формула массива. Затем можете скопировать вниз по столбцу, чтобы получить данные по другим критериям выбора.

Как видите, мы получили в одной ячейке несколько значений, среди которых нет одинаковых, хотя в исходных данных таковые имеются.

Надеюсь, эти примеры будут вам полезны для поиска сразу нескольких значений в Excel.  Благодарю вас за чтение.

Функция ЕСЛИОШИБКА – примеры формул В статье описано, как использовать функцию ЕСЛИОШИБКА в Excel для обнаружения ошибок и замены их пустой ячейкой, другим значением или определённым сообщением. Покажем примеры, как использовать функцию ЕСЛИОШИБКА с функциями визуального…
5 способов – поиск значения в массиве Excel В статье предлагается несколько различных формул для выполнения поиска в двумерном массиве значений Excel.  Просмотрите эти варианты и выберите наиболее для вас подходящий. При поиске данных в электронных таблицах Excel…
Поиск ИНДЕКС ПОИСКПОЗ по нескольким условиям В статье показано, как выполнять быстрый поиск с несколькими условиями в Excel с помощью ИНДЕКС и ПОИСКПОЗ. Хотя Microsoft Excel предоставляет специальные функции для вертикального и горизонтального поиска, опытные пользователи…
ИНДЕКС ПОИСКПОЗ как лучшая альтернатива ВПР В этом руководстве показано, как использовать ИНДЕКС и ПОИСКПОЗ в Excel и чем они лучше ВПР. В нескольких недавних статьях мы приложили немало усилий, чтобы объяснить основы функции ВПР новичкам и предоставить…
Поиск в массиве при помощи ПОИСКПОЗ В этой статье объясняется с примерами формул, как использовать функцию ПОИСКПОЗ в Excel.  Также вы узнаете, как улучшить формулы поиска, создав динамическую формулу с функциями ВПР и ПОИСКПОЗ. В Microsoft…
Функция ИНДЕКС в Excel — 6 примеров использования В этом руководстве вы найдете ряд примеров формул, демонстрирующих наиболее эффективное использование ИНДЕКС в Excel. Из всех функций Excel, возможности которых часто недооцениваются и используются недостаточно, ИНДЕКС определенно занимает место…
Как объединить две или несколько таблиц в Excel В этом руководстве вы найдете некоторые приемы объединения таблиц Excel путем сопоставления данных в одном или нескольких столбцах. Как часто при анализе в Excel вся необходимая информация собирается на одном…
Вычисление номера столбца для извлечения данных в ВПР Задача: Наиболее простым способом научиться указывать тот столбец, из которого функция ВПР будет извлекать данные. При этом мы не будем изменять саму формулу, поскольку это может привести в случайным ошибкам.…

Множественный ВПР() — выводим несколько значений по ключевому значению в MS EXCEL

history 30 сентября 2020 г.
    Группы статей

Функция ВПР () ищет заданное значение в ключевом столбце и выводит значение из соседнего столбца. Ключевой столбец в этом случае не содержит повторов. А что если содержит? Тогда функция выведет только первое встретившееся значение. Напишем формулу, которая выводит все значения, соответствующие искомому. Назовем эту формулу множественный ВПР().

Пусть дана исходная таблица с номерами заказов и товарами. Номера заказов могут повторяться.

У заказа 2 три повтора, в строке 3, 4 и 6. Перечень заказов не сортирован.

Выведем все наименования товаров для заказа 2, а также количество этих товаров.

Так как в ключевом столбце (Заказ) теперь несколько одинаковых значений, то функция ВПР() не годится — она выведет только самое первое, т.е. товар Манго. Чтобы вывести все 3 значения у заказа 2 создадим служебный столбец рядом с исходной таблицей.

Поместим в него формулу =СЧЁТЕСЛИ($B$8:B8;B8)

Она подсчитает номера повторов для каждого заказа. Нужный заказ введем в желтую ячейку. Соответствующие позиции этого заказа подсвечиваются зеленым цветом в исходной таблицке с помощью условного форматирования.

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

определим позиции повтора в исходной таблице (оранжевый столбец в нижней таблице). Это обычная формула (не формула массива).

Наименование товара выведем с помощью простой формулы =ИНДЕКС(C$8:C$14;$B23), аналогично выведем Количество.

Изменив в желтой ячейке номер заказа на 1, нижняя табличка изменится.

Покажем как работает формула =СУММПРОИЗВ(($B$8:$B$14=$A$20)*($E$8:$E$14=A23)*(СТРОКА($B$8:$B$14)-СТРОКА($B$7))) для заказа 1:

  • три выражения $B$8:$B$14=$A$20, $E$8:$E$14=A23 и СТРОКА($B$8:$B$14)-СТРОКА($B$7) порождают 3 массива чисел
  • первый массив — это номера позиций искомого заказа в исходной таблице. Выражение дает <ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ>, т.е.ИСТИНА соответствует номерам позиций 1 и 5 (выделено зеленым). Убедиться в этом просто — достаточно выделить выражение в строке формул и нажать клавишу F9
  • второе выражение дает массив <ИСТИНА:ИСТИНА:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА>, который представляет номер повтора заказа (данный массив соответствует первому повтору). Номер повтора заказа из А23 (1) и из А24 (2) сравнивается номерами повторов заказов в столбце Е. Например, номер повтора 1 есть во многих строках: 1, 2, 3, 7 и часть из них не соответствует заказу №1. Это как раз и показывает массив — значение ИСТИНА стоит у элементов массива №№1, 2, 3, 7
  • произведение этих массивов дает множество, которое соответствует и номеру заказа (1) и его повтору в исходной таблице (1 в строке 23, и 2 в строке 24). Вот этот массив <1:0:0:0:0:0:0>, где 1 соответствует ИСТИНА. 1 получается перемножением 2-х ИСТИНА, все остальные комбинации ЛОЖЬ*ЛОЖЬ, ЛОЖЬ*ИСТИНА дают 0. Перемножение происходит попарно.
  • наконец, умножая предыдущий массив на массив порядковых номеров в исходной таблице получим только тот номер, который соответствует и номеру заказа и его повтору. Он будет только один, остальные в массиве будут равны 0. Вот этот массив для заказа 1 и его повтора 2: <0:0:0:0:5:0:0>Это 5-я позиция в исходной таблице.
  • Функция СУММПРОИЗ() складывает все элементы массива, т.к. ненулевой элемент заведомо только один, то функция отбросит все 0 и выведет позицию.

Поиск и подстановка по нескольким условиям

Постановка задачи

Если вы продвинутый пользователь Microsoft Excel, то должны быть знакомы с функцией поиска и подстановки ВПР или VLOOKUP (если еще нет, то сначала почитайте эту статью, чтобы им стать). Для тех, кто понимает, рекламировать ее не нужно 🙂 — без нее не обходится ни один сложный расчет в Excel. Есть, однако, одна проблема: эта функция умеет искать данные только по совпадению одного параметра. А если у нас их несколько?

Предположим, что у нас есть база данных по ценам товаров за разные месяцы:

vlookup-2cols1.png

Нужно найти и вытащить цену заданного товара (Нектарин) в определенном месяце (Январь), т.е. получить на выходе152, но автоматически, т.е. с помощью формулы. ВПР в чистом виде тут не поможет, но есть несколько других способов решить эту задачу.

Способ 1. Дополнительный столбец с ключом поиска

Это самый очевидный и простой (хотя и не самый удобный) способ. Поскольку штатная функция ВПР (VLOOKUP) умеет искать только по одному столбцу, а не по нескольким, то нам нужно из нескольких сделать один!

Добавим рядом с нашей таблицей еще один столбец, где склеим название товара и месяц в единое целое с помощью оператора сцепки (&), чтобы получить уникальный столбец-ключ для поиска:

vlookup-2cols2.png

Теперь можно использовать знакомую функцию ВПР (VLOOKUP) для поиска склеенной пары НектаринЯнварь из ячеек H3 и J3 в созданном ключевом столбце:

vlookup-2cols3.png

Плюсы : Простой способ, знакомая функция, работает с любыми данными.

Минусы : Надо делать дополнительный столбец и потом, возможно, еще и прятать его от пользователя. При изменении числа строк в таблице — допротягивать формулу сцепки на новые строки (хотя это можно упростить применением умной таблицы).

Способ 2. Функция СУММЕСЛИМН

Если нужно найти именно число (в нашем случае цена как раз число), то вместо ВПР можно использовать функцию СУММЕСЛИМН (SUMIFS) , появившуюся начиная с Excel 2007. По идее, эта функция выбирает и суммирует числовые значения по нескольким (до 127!) условиям. Но если в нашем списке нет повторяющихся товаров внутри одного месяца, то она просто выведет значение цены для заданного товара и месяца:

vlookup-2cols4.png

Плюсы : Не нужен дополнительный столбец, решение легко масштабируется на большее количество условий (до 127), быстро считает.

Минусы : Работает только с числовыми данными на выходе, не применима для поиска текста, не работает в старых версиях Excel (2003 и ранее).

Способ 3. Формула массива

О том, как спользовать связку функций ИНДЕКС (INDEX) и ПОИСКПОЗ (MATCH) в качестве более мощной альтернативы ВПР я уже подробно описывал (с видео). В нашем же случае, можно применить их для поиска по нескольким столбцам в виде формулы массива. Для этого:

  1. Выделите пустую зеленую ячейку, где должен быть результат.
  2. Введите в строке формул в нее следующую формулу:

vlookup-2cols6.png

  • Нажмите в конце не Enter, а сочетание Ctrl+Shift+Enter, чтобы ввести формулу не как обычную, а как формулу массива.
  • Как это на самом деле работает:

    Функция ИНДЕКС выдает из диапазона цен C2:C161 содержимое N-ой ячейки по порядку. При этом порядковый номер нужной ячейки нам находит функция ПОИСКПОЗ. Она ищет связку названия товара и месяца (НектаринЯнварь) по очереди во всех ячейках склеенного из двух столбцов диапазона A2:A161&B2:B161 и выдает порядковый номер ячейки, где нашла точное совпадение. По сути, это первый способ, но ключевой столбец создается виртуально прямо внутри формулы, а не в ячейках листа.

    Плюсы : Не нужен отдельный столбец, работает и с числами и с текстом.

    Минусы : Ощутимо тормозит на больших таблицах (как и все формулы массива, впрочем), особенно если указывать диапазоны «с запасом» или сразу целые столбцы (т.е. вместо A2:A161 вводить A:A и т.д.) Многим непривычны формулы массива в принципе (тогда вам сюда).

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    Всем привет.
    Подскажите пожалуйста подробнее как сделать в ситуации:

    Первая таблица это один столбец с id номерами (задвоений номеров нет, всего более 15 000 номеров)
    Вторая таблица это четыре столбца: id номера, данные1, данные2, данные3. Здесь уже есть очень много задвоений по id номерам, но данные1,2,3 по ним разные.

    Надо подтянуть в первую таблицу к столбцу с id номерами данные из второй таблицы. Поскольку во второй таблице много задвоений id номеров, то через vlookup получается подтянуть только одно самое первое значение. А мне надо, чтобы если id номер во второй таблице имеет несколько значений (кстати, не более пяти в любом случае), то они должны встать в строку во второй, третий и так далее столбцы первой таблицы.
    Пример того как надо:  

    Прикрепленные файлы

    • 11.jpg (67.59 КБ)

    Изменено: Reqwiem27.11.2015 12:24:16

     

    Hugo

    Пользователь

    Сообщений: 23253
    Регистрация: 22.12.2012

    Поставьте себе Finereader, закиньте в него картинку из первого поста, распознайте, сохраните в файл Экселя, настройте фильтры, файл покажите на форуме.
    Ну или как вариант перенабейте всё это вручную.
    Или наберите пример поменьше.
    Хотя не мне ведь Вас учить…

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    #3

    27.11.2015 12:35:35

    Цитата
    Сергей написал:
    по описанию вам в приемы ищите многоразовый ВПР

    http://www.planetaexcel.ru/techniques/2/81/

    Пытался вникнуть. IQ не хватает. Надо больше подробностей.

    Изменено: Reqwiem27.11.2015 12:35:48

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    нам тоже надо подробностей, более конкретный ответ может быть на конкретном примере

    Лень двигатель прогресса, доказано!!!

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    пока кофе пью нате вам пример с секретной информацией

    Лень двигатель прогресса, доказано!!!

     

    The_Prist

    Пользователь

    Сообщений: 14182
    Регистрация: 15.09.2012

    Профессиональная разработка приложений для MS Office

    Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    Добавил более менее в том виде, который есть.

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    Reqwiem, ну вы бы хоть попробовали сами, ведь мой пример точно в такой же структуре как ваш просто нужно поменять диапазоны

    Лень двигатель прогресса, доказано!!!

     

    JayBhagavan

    Пользователь

    Сообщений: 11833
    Регистрация: 17.01.2014

    ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

    =ЕСЛИОШИБКА(ИНДЕКС(‘Таблица 2’!$B:$B;АГРЕГАТ(15;6;СТРОКА(‘Таблица 2’!$A$2:$A$25)/(‘Таблица 2’!$A$2:$A$25=$B3);СТОЛБЕЦ()-СТОЛБЕЦ($B:$B)));»»)
    =ЕСЛИОШИБКА(ИНДЕКС(‘Таблица 2’!$C:$C;АГРЕГАТ(15;6;СТРОКА(‘Таблица 2’!$A$2:$A$25)/(‘Таблица 2’!$A$2:$A$25=$B14);СТОЛБЕЦ()-СТОЛБЕЦ($B:$B)));»»)

    <#0>
    Формула массива (ФМ) вводится Ctrl+Shift+Enter
    Memento mori

     

    Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    Михаил, спасибо что сделали всё наглядно.
    Но не работает при попытке написать подобное в моих листах :(
    Толи правда iq маловат, толи кардинально не понимаю каких то моментов.

    Блок iferror можем опустить — ибо не страшно сейчас.
    index — первый диапазон — это информация, откуда мы будем её подтягивать
    потом small, if диапазон условия для подтягивания если равно тому, откуда тянем
    а вот дальше ROW и последующие — для чего и почему — мне не понять. Можете подсказать?

    Изменено: Reqwiem27.11.2015 15:56:28

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    Строка(3:26) создаст массив цифр {3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26}- Строка(3) даст нам 3 +1, в итоге мы получим {3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26}-3+1 после вычисления мы получим порядок строк равный нашему диапазону {1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24} с которым будет работать условие если ЕСЛИ({ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};{1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24};»»), после отработки условий мы получим диапазон цифр с которыми будет работать наименьшее
    НАИМЕНЬШИЙ({1:»»:»»:»»:»»:»»:7:»»:»»:»»:»»:»»:13:»»:»»:»»:»»:»»:19:»»:»»:»»:»»:»»};СТОЛБЕЦ()-2)

    Лень двигатель прогресса, доказано!!!

     

    JayBhagavan

    Пользователь

    Сообщений: 11833
    Регистрация: 17.01.2014

    ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

    » — Дохтер, меня игнорирую. — Следующий!» =)))

    <#0>
    Формула массива (ФМ) вводится Ctrl+Shift+Enter
    Memento mori

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    Мне с русского переводить в английский сложновато. Я ж в англ. экселе работаю.

     

    JayBhagavan

    Пользователь

    Сообщений: 11833
    Регистрация: 17.01.2014

    ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

    Reqwiem, а в файле не судьба глянуть? Я потому его и приложил, что Вы указали, что у вас англ. офис.

    <#0>
    Формула массива (ФМ) вводится Ctrl+Shift+Enter
    Memento mori

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    #16

    27.11.2015 21:17:42

    Цитата
    Reqwiem написал: Мне с русского переводить в английский сложновато

    поищите в инете перевод функций с англицкого на русский и наоборот есть сайты и файлы эксель с такой замутой

    Лень двигатель прогресса, доказано!!!

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    Народ, посмотрите пожалуйста, в чем я туплю… Ни в какую не работает, хотя вроде всё верно…

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    смотрите

    Лень двигатель прогресса, доказано!!!

     

    jakim

    Пользователь

    Сообщений: 1947
    Регистрация: 01.03.2013

    Попробуйте так, если у Вас Excel не старше 2010 года.
    Для более ранних версий тоже можно сочинить похожую формулу, но она уже будет немного сложнее.

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    Сергей, спасибо.
    Всё работает. Точнее, работает до того момента, пока я не пытаюсь увеличить массив. Если сейчас массив идет по 3000 строку: =IFERROR(INDEX($P$4:$P$3000;SMALL(IF($B2=$N$4:$N$3000;ROW($N$1:$N$2997);»»);COLUMN()-4));»»)   ,
    а я ручками пишу в формуле например по 3924 строку
    =IFERROR(INDEX($P$4:$P$3924;SMALL(IF($B2=$N$4:$N$3924;ROW($N$1:$N$3924);»»);COLUMN()-4));»»)
    потом alt+shift+enter для постановки скобок, что это формула массива {  }

    И всё перестает работать….  Что я не так делаю???

    Изменено: Reqwiem04.12.2015 13:02:33

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    вот в этом месте ROW($N$1:$N$3924) ставьте диапазон на 3 строки меньше ROW($N$1:$N$3921)

    Лень двигатель прогресса, доказано!!!

     

    Reqwiem

    Пользователь

    Сообщений: 23
    Регистрация: 13.01.2014

    Офигеть… Работает…
    Сергей, огромное спасибо.

    P.S. А почему там надо было -3 делать?

     

    Сергей

    Пользователь

    Сообщений: 11251
    Регистрация: 01.01.1970

    #23

    04.12.2015 13:15:54

    у вас диапазон где находятся данные с 4 по 3924 строку то есть в чистом виде это 3921 строка дак вот, тут мы зачищаем IF($B2=$N$4:$N$3924;ROW($N$1:$N$3924) диапазон от ненужного, в сообщениях выше я показывал как он выглядит после отработки и в таком виде ROW($N$1:$N$3924) у вас получается 3924 строки, а проверку мы провели $B2=$N$4:$N$3924 по 3921 строке и для формулы получается затык как  наложить провереный диапазон из 3921 строки на диапазон из 3924 строк
    ну как то так

    Лень двигатель прогресса, доказано!!!

    Хитрости »

    11 Июль 2016              126452 просмотров


    ВПР с возвратом всех значений

    Все, кто сталкивался с функцией ВПР знают, что она умеет возвращать исключительно одно значений — первое найденное. Но что делать, когда надо видеть все значения? К примеру имеется такая таблица:
    Таблица
    И из этой таблицы необходимо получить фамилии(поле ФИО) всех сотрудников из отдела Сбыта:
    Таблица
    Тут два варианта:

    • Вариант 1: все значения необходимо получить в одной ячейке через разделитель(скажем запятую). Такое возможно только через использование VBA(на момент написания статьи). Такую функцию я написал давно: Как сцепить несколько значений в одну ячейку по критерию? СцепитьЕсли
    • . В результате получим что-то вроде: Александров Иван,Александров Петр,Андреев Алексей.

    • Вариант 2: каждое значение должно быть в отдельной ячейке. Этот вариант мы и рассмотрим более подробно в данной статье. Причем решать задачу будем без использования макросов — только встроенными функциями

    Здесь надо сразу оговориться — при помощи непосредственно ВПР(VLookup) это сделать ну никак не получится. Но это можно сделать при помощи её родственников — связки ИНДЕКС(ПОИСКПОЗ)(INDEX(MATCH)). Плюс еще пара функций. В сборе функция выглядит так:
    =ИНДЕКС($A$12:$G$111;НАИМЕНЬШИЙ(ЕСЛИ($I$12=$C$12:$C$111;СТРОКА($C$12:$C$111)-11);СТРОКА(A1));1)
    =INDEX($A$12:$G$111;SMALL(IF($I$12=$C$12:$C$111;ROW($C$12:$C$111)-11);ROW(A1));1)
    где:

    • $A$12:$G$111 — таблица с ФИО и всеми данными
    • $I$12 — ячейка с названием отдела
    • $C$12:$C$111 — столбец с названиями отделов в таблице $A$12:$G$111

    А теперь начнем разбирать формулу по кусочкам
    Предлагаю сразу скачать пример файла с данными и формулами — тогда понять будет проще:

      Tips_All_VlookupAllVals.xls (84,5 KiB, 23 011 скачиваний)

    • Первое и самое главное — формула вводится в ячейку как формула массива. Это значит, что для приложенного к статье примера необходимо будет выделить ячейку J12, записать в неё формулу и завершить ввод нажатием сразу трех клавиш: Ctrl+Shift+Enter. После этого скопировать ячейку, выделить диапазон J13:J39 и вставить туда скопированную ячейку.
    • За отбор ФИО указанного отдела отвечает этот кусок: ЕСЛИ($I$12=$C$12:$C$111;СТРОКА($C$12:$C$111)-11)
      IF($I$12=$C$12:$C$111;ROW($C$12:$C$111)-11)
      Как видно здесь идет сравнение отдела, записанного в $I$12 со всеми отделами в таблице: $C$12:$C$111. Если отдел совпадает, то функция возвращает номер строки СТРОКА($C$12:$C$111). Но нам нужен не номер строки на листе, а номер строки внутри таблицы(потому что в формулу ИНДЕКС(INDEX) у нас передан диапазон $A$12:$G$111 и если передать в его второй аргумент(номер_строки) 14, то получим не Александров Иван, а Андреев Олег). Поэтому отнимаем от номера строки 11, чтобы было возвращено число 3(а не 14). Т.к. формула записана формулой массива — ЕСЛИ(IF) возвращает массив из номеров строк и логического ЛОЖЬ(FALSE)(если отдел не совпадает):
      шаг 1: ЕСЛИ({ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};{12:13:14:15:16:17:18:19:20}-11)
      шаг 2: ЕСЛИ({ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};{1:2:3:4:5:6:7:8:9})
      шаг 3: {ЛОЖЬ:ЛОЖЬ:3:ЛОЖЬ:ЛОЖЬ:6:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ}
    • Т.к. ЕСЛИ(IF) в данном случае возвращает массив значений, включая ненужные нам ЛОЖЬ(FALSE) — применяем НАИМЕНЬШИЙ(SMALL), которая будет брать только числа (сначала 3, затем 6 и т.д.), а логические значения ЛОЖЬ(FALSE) будет игнорировать:
      НАИМЕНЬШИЙ({ЛОЖЬ:ЛОЖЬ:3:ЛОЖЬ:ЛОЖЬ:6:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};СТРОКА(A1))
      SMALL({ЛОЖЬ:ЛОЖЬ:3:ЛОЖЬ:ЛОЖЬ:6:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};ROW(A1))
      Функция НАИМЕНЬШИЙ(SMALL) отбирает из указанного массива чисел наименьшее. При этом можно отобрать по рангу — первое наименьшее, второе наименьшее, третье наименьшее и т.д.

      1. с первым аргументом разобрались — это уже отобранные записи, где число — строка в таблице с нужной ФИО и ненужные нам логические ЛОЖЬ(FALSE).
      2. второй аргумент СТРОКА(A1) для каждой следующей строки будет меняться. В приложенном примере первая ячейка с формулой — J12. В ней СТРОКА(A1) равна 1, т.е. НАИМЕНЬШИЙ(SMALL) вернет первое наименьшее из массива чисел — 3. В ячейке J13 это уже будет СТРОКА(A2) и она равна 2, а значит НАИМЕНЬШИЙ(SMALL) вернет второе наименьшее из массива чисел — 6. И т.д. Когда все числа закончатся — НАИМЕНЬШИЙ(SMALL) вернет значение ошибки #ЧИСЛО!(#NUM!)
        ячейка J12
        шаг 1: НАИМЕНЬШИЙ({ЛОЖЬ:ЛОЖЬ:3:ЛОЖЬ:ЛОЖЬ:6:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};СТРОКА(A1))
        шаг 2: НАИМЕНЬШИЙ({ЛОЖЬ:ЛОЖЬ:3:ЛОЖЬ:ЛОЖЬ:6:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};1)
        шаг 3: НАИМЕНЬШИЙ(3)
        ячейка J13
        шаг 1: НАИМЕНЬШИЙ({ЛОЖЬ:ЛОЖЬ:3:ЛОЖЬ:ЛОЖЬ:6:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};СТРОКА(A2))
        шаг 2: НАИМЕНЬШИЙ({ЛОЖЬ:ЛОЖЬ:3:ЛОЖЬ:ЛОЖЬ:6:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ};2)
        шаг 3: НАИМЕНЬШИЙ(6)

    • И последний штрих — все это передается в функцию ИНДЕКС(INDEX). Для ячейки J12 это будет значение ячейки, расположенной на пересечении 3-й строки и 1-го столбца диапазона $A$12:$G$111. На листе это ячейка A14. Т.е. третья сверху ячейка столбца А в диапазоне $A$12:$G$111 — Александров Иван.

      ячейка J12
      шаг 1: =ИНДЕКС($A$12:$G$111;НАИМЕНЬШИЙ(3);1)
      шаг 2: =ИНДЕКС($A$12:$G$111;3;1)
      шаг 3: Александров Иван
      ячейка J13
      шаг 1: =ИНДЕКС($A$12:$G$111;НАИМЕНЬШИЙ(6);1)
      шаг 2: =ИНДЕКС($A$12:$G$111;6;1)
      шаг 3: Александров Петр

    И в довершение неплохо бы убрать ошибку в случае, если ни одно значение не соответствует критерию или значений больше, чем ячеек с формулами. Более подробно подобное решение я описывал в этой статье: Как в ячейке с формулой вместо ошибки показать 0
    Для всех версий Excel:
    =ЕСЛИ(ЕОШ(ИНДЕКС($A$12:$G$111;НАИМЕНЬШИЙ(ЕСЛИ($I$12=$C$12:$C$111;СТРОКА($C$12:$C$111)-11);СТРОКА(A1));1));»»;ИНДЕКС($A$12:$G$111;НАИМЕНЬШИЙ(ЕСЛИ($I$12=$C$12:$C$111;СТРОКА($C$12:$C$111)-11);СТРОКА(A1));1))
    =IF(ISERR(INDEX($A$12:$G$111;SMALL(IF($I$12=$C$12:$C$111;ROW($C$12:$C$111)-11);ROW(A1));1));»»;INDEX($A$12:$G$111;SMALL(IF($I$12=$C$12:$C$111;ROW($C$12:$C$111)-11);ROW(A1));1))
    Для Excel 2007 и выше:
    =ЕСЛИОШИБКА(ИНДЕКС($A$12:$G$111;НАИМЕНЬШИЙ(ЕСЛИ($I$12=$C$12:$C$111;СТРОКА($C$12:$C$111)-11);СТРОКА(A1));1);»»)
    =IFERROR(INDEX($A$12:$G$111;SMALL(IF($I$12=$C$12:$C$111;ROW($C$12:$C$111)-11);ROW(A1));1);»»)
    Плюс к этому в приложенном к статье файле я привел формулу, которая возвращает список всех сотрудников выбранного отдела без повторений и формулу с возможностью просто поменять заголовок в результирующем столбце(в файле это столбец K, ячейка K11) на любой из исходной таблицы и данные будут отображены из этого столбца.
    Например, если вместо столбца ФИО записать в K11 Адрес — будут отображены все адреса сотрудников выбранного отдела. Если записать Телефон — все телефоны сотрудников выбранного отдела.

    Скачать пример:

      Tips_All_VlookupAllVals.xls (84,5 KiB, 23 011 скачиваний)

    Так же см.:
    Как найти значение в другой таблице или сила ВПР
    ВПР с поиском по нескольким листам
    ВПР_МН


    Статья помогла? Поделись ссылкой с друзьями!

      Плейлист   Видеоуроки


    Поиск по меткам

    

    Access
    apple watch
    Multex
    Power Query и Power BI
    VBA управление кодами
    Бесплатные надстройки
    Дата и время
    Записки
    ИП
    Надстройки
    Печать
    Политика Конфиденциальности
    Почта
    Программы
    Работа с приложениями
    Разработка приложений
    Росстат
    Тренинги и вебинары
    Финансовые
    Форматирование
    Функции Excel
    акции MulTEx
    ссылки
    статистика

    подтянуть ВПРом несколько значений

    SergeyKorotun

    Дата: Среда, 25.03.2015, 11:12 |
    Сообщение № 1

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    Здравствуйте, описание задачи в приложенном файле. Возможно решить формулами? Или только макросом?

    К сообщению приложен файл:

    qwerty.xlsx
    (9.0 Kb)

     

    Ответить

    _Boroda_

    Дата: Среда, 25.03.2015, 11:31 |
    Сообщение № 2

    Группа: Модераторы

    Ранг: Местный житель

    Сообщений: 16618


    Репутация:

    6465

    ±

    Замечаний:
    0% ±


    2003; 2007; 2010; 2013 RUS

    Вариант 1, немассивный. только значения снизу вверх ставятся

    Код

    =ЕСЛИОШИБКА(ПРОСМОТР(;-1/($H$2:$H$8=$A2)/ЕНД(ПОИСКПОЗ($I$2:$I$8;$A2:A2;));$I$2:$I$8);»»)

    вариант 2, массивный

    Код

    =ЕСЛИОШИБКА(ИНДЕКС($I$2:$I$8;НАИМЕНЬШИЙ(ЕСЛИ($H$2:$H$8=$A2;СТРОКА(H$1:H$7));СТОЛБЕЦ(A2)));»»)


    Скажи мне, кудесник, любимец ба’гов…
    Платная помощь:
    Boroda_Excel@mail.ru
    Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

     

    Ответить

    Pelena

    Дата: Среда, 25.03.2015, 12:15 |
    Сообщение № 3

    Группа: Админы

    Ранг: Местный житель

    Сообщений: 18797


    Репутация:

    4284

    ±

    Замечаний:
    ±


    Excel 2016 & Mac Excel

    Обязательно по горизонтали располагать значения? Если нет, то вариант со сводной

    К сообщению приложен файл:

    8248009.xlsx
    (13.0 Kb)


    «Черт возьми, Холмс! Но как??!!»
    Ю-money 41001765434816

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 12:48 |
    Сообщение № 4

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    _Boroda_, можете кратко описать первую формулу. Хотелось бы осознанно и в других задачах использовать такое решение.

    В описании функции ПРОСМОТР требуется упорядоченность просматриваемого вектора. Перед вставкой формул я отсортирую таблицу по возрастанию фамилий. Но поскольку много фамилий в исходном списке с ошибками, то им не будет найдено соответствующее id. Во многих фамилиях ошибки очевидны, и после внесения правок список стает неупорядоченным. А вносить правки после вставки формул удобнее, т.к. не нужно перечитывать те фамилии, id которых заполнился с помощью формул. Можно отключить применение формул, внести правки и снова включить, но в неправильной фамилии может быть несколько вариантов правильной и сразу не будет видно ту ли именно фамилию получили.

    Во второй формуле наверно А2 нужно заменить на А19

     

    Ответить

    krosav4ig

    Дата: Среда, 25.03.2015, 13:12 |
    Сообщение № 5

    Группа: Друзья

    Ранг: Старожил

    Сообщений: 2346


    Репутация:

    989

    ±

    Замечаний:
    0% ±


    Excel 2007,2010,2013

    если добавить доп.столбец, то можно сводной и по горизонтали расположить


    email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 13:19 |
    Сообщение № 6

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    Pelena, любой вариант решения подойдет. Но вы наверно неверно поняли условие задачи.
    Есть большая база данных (зеленая таблица, 30 000 записей). Одно и то же ФИО там встречается много раз, но это разные люди (у каждого уникальное id).
    Дали список из 1500 фамилий (желтая таблица). В нее надо для каждого ФИО из зеленой таблицы подтянуть все id.

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 13:35 |
    Сообщение № 7

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    krosav4ig, я наверно плохо сформулировал условие задачи. Переформулировал в предыдущем сообщении.
    Когда то я задавал существует ли в екселе формулы наподобии ранжирующих в оракле, ответ тогда не получил. А вы сегодня аналогичную функцию применили: счетели.

    PS решение в столбик будет более удобным, т.к. потом по id нужно будет подтягивать и другие данные.

     

    Ответить

    VEKTORVSFREEMAN

    Дата: Среда, 25.03.2015, 13:47 |
    Сообщение № 8

    Группа: Друзья

    Ранг: Ветеран

    Сообщений: 772


    Репутация:

    129

    ±

    Замечаний:
    0% ±


    MS Office Excel 2010

    Но вы наверно неверно поняли условие задачи

    а где указано

    Есть большая база данных (зеленая таблица, 30 000 записей). Одно и то же ФИО там встречается много раз, но это разные люди (у каждого уникальное id).
    Дали список из 1500 фамилий (желтая таблица). В нее надо для каждого ФИО из зеленой таблицы подтянуть все id.

    посмотрите тут


    «Опыт — это то, что получаешь, не получив того, что хотел»

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 13:59 |
    Сообщение № 9

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007


    Вот здесь:

    описание задачи в приложенном файле

     

    Ответить

    VEKTORVSFREEMAN

    Дата: Среда, 25.03.2015, 14:07 |
    Сообщение № 10

    Группа: Друзья

    Ранг: Ветеран

    Сообщений: 772


    Репутация:

    129

    ±

    Замечаний:
    0% ±


    MS Office Excel 2010

    может у меня со зрением плохо, но в файле всё описано «в двух словах», а хотите … (ну в общем, я уже цитировал выше)

    К сообщению приложен файл:

    2078887.jpg
    (22.3 Kb)


    «Опыт — это то, что получаешь, не получив того, что хотел»

     

    Ответить

    _Boroda_

    Дата: Среда, 25.03.2015, 14:08 |
    Сообщение № 11

    Группа: Модераторы

    Ранг: Местный житель

    Сообщений: 16618


    Репутация:

    6465

    ±

    Замечаний:
    0% ±


    2003; 2007; 2010; 2013 RUS

    можете кратко описать первую формулу

    Объяснялка для ПРОСМОТР
    Давайте посмотрим на несколько выдержек из справки:
    1. «Если функции ПРОСМОТР не удается найти искомое_значение, то в просматриваемом_векторе выбирается наибольшее значение, которое меньше искомого_значения или равно ему.»;
    2. «Значения в аргументе просматриваемый_вектор должны быть расположены в порядке возрастания:».

    Теперь рассмотри кусок формулы -1/($H$2:$H$8=$A2)/ЕНД(ПОИСКПОЗ($I$2:$I$8;$A2:A2;)).
    а) $H$2:$H$8=$A2 — если равно, то ИСТИНА, если не равно, то ЛОЖЬ.
    б) ПОИСКПОЗ(…) — если нашел то, что слева в заданном массиве ID, то какое-то число, если не нашел — ошибка Н/Д. ЕНД преобразует полученное ПОИСКПОЗом в ИСТИНА, если ПОИСКПОЗ дает Н/Д и ЛОЖЬ в остальных случаях.
    в) минус единица, деленная на а) и деленная на б) даст нам или ошибки деления на ноль (если хотя бы что-то из а) или б) равно ЛОЖЬ), или какие-то отрицательные числа. Нам сейчас без разницы, что за числа, нам важно, что они отрицательны.
    г) ПРОСМОТР(;… можно перевести на нормальный язык как ПРОСМОТР(0;…, следовательно, мы ищем ноль в массиве из пункта в) — массиве из отрицательных чисел и ошибок. Ошибки не считаются вообще в данном случае, следовательно, имеем массив отрицательных чисел. Ноль мы там никак не сможем найти — он заведомо больше любого отрицательного числа.
    А теперь смотрим на цитату 2. — по умолчанию полагается, что самое последнее значение — это самое большое значение (массив-то упорядочен по возрастанию).
    Теперь смотрим на цитату 1. и п. г) и делаем вывод, что нам покажут то значение, которое находится самым последним из удовлетворяющих условиям пунктов а) и б).


    Скажи мне, кудесник, любимец ба’гов…
    Платная помощь:
    Boroda_Excel@mail.ru
    Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 15:20 |
    Сообщение № 12

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    может у меня со зрением плохо, но в файле всё описано «в двух словах», а хотите … (ну в общем, я уже цитировал выше)

    Но _Boroda_ все понял и два варианта решения предоставил.

    Давайте посмотрим на несколько выдержек из справки:

    Распечатал, вечером дома почитаю, надеюсь разберусь.
    В будущем буду использовать ваше решение.
    А пока, используя вариант krosav4ig, создам сводную таблицу из справочной базы (зеленой, для каждого ФИО получу в соседних колонках все ID), а затем несколькими простыми ВПРами подтяну все ID в желтую таблицу.

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 16:31 |
    Сообщение № 13

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    Подскажите, в krosav4ig в сводной таблице в названиях строк стоят FIO, в названиях столбцов — №, а значения заполнены значениями ID. При этом в списке полей перед полем ID тычка стоит, а в окне «значения» этого поля нет.
    Когда я в своей таблице ставлю тычку перед этим полем, оно попадает в окно «названия строк», если перетаскиваю его в окно значения и выставляю параметр «сумма», то у меня в сводной таблице отображается количество ID, а не их значения, если же я снимаю тычку перед полем ID, то оно исчезает с окна «значения» и данные в сводной таблице исчезают.

    Если создаю сводную на таблице krosav4ig, то все выходит автоматом.
    Свою таблицу приложить не могу.

     

    Ответить

    Hugo

    Дата: Среда, 25.03.2015, 17:54 |
    Сообщение № 14

    Группа: Друзья

    Ранг: Участник клуба

    Сообщений: 3140


    Репутация:

    670

    ±

    Замечаний:
    0% ±


    2010, теперь уже с PQ

    Код

    =VLOOKUPCOUPLE($H$2:$I$8,1,A19,2,», «)

    Ищите код на форуме — это UDF


    excel@nxt.ru
    webmoney: R418926282008 Z422237915069

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 21:50 |
    Сообщение № 15

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    Умножил в реальной таблице значения ID через специальную вставку на 1 и сводная таблица заполнилась значениями ID, а не нулями. Но ведущие нули потерял.
    Вопрос в приложенном файле.
    [moder]Это уже совсем другой вопрос, значит, другая тема[/moder]

    К сообщению приложен файл:

    qwerty2.xlsx
    (12.6 Kb)

    Сообщение отредактировал PelenaСреда, 25.03.2015, 22:02

     

    Ответить

    SergeyKorotun

    Дата: Среда, 25.03.2015, 22:33 |
    Сообщение № 16

    Группа: Проверенные

    Ранг: Обитатель

    Сообщений: 301


    Репутация:

    15

    ±

    Замечаний:
    0% ±


    Excel 2007

    Ну почему же другая? Я применил решение, предложенное krosav4ig, но не на приложенном файле, а на реальном, и получил не то, что должно быть.
    Но если вы будете настаивать, мне не трудно создать тему, только в этом случае помогающим придется снова разбираться с нуля.

     

    Ответить

    Serge_007

    Дата: Суббота, 07.11.2015, 22:04 |
    Сообщение № 17

    Группа: Админы

    Ранг: Местный житель

    Сообщений: 15894


    Репутация:

    2623

    ±

    Замечаний:
    ±


    Excel 2016

    Это уже совсем другой вопрос, значит, другая тема

    Верно, это другая тема

    помогающим придется снова разбираться с нуля

    Не придется. Вопросы никак не связаны между собой


    ЮMoney:41001419691823 | WMR:126292472390

     

    Ответить

    Понравилась статья? Поделить с друзьями:
  • Как подтянуть картинки в excel через впр
  • Как подтянуть дату в excel
  • Как подтянуть данные по значению в excel
  • Как подтянуть данные в excel с сайта
  • Как подтягивать текст в excel