Хитрости »
Основные понятия (23)
Сводные таблицы и анализ данных (9)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (14)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (63)
Разное (38)
Баги и глюки Excel (2)

ВПР по двум и более критериям

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

Для большего понимания смысла статьи рекомендую сначала скачать файл с примером данных и формул:
Скачать пример:

  Tips_All_VlookupMany.xls (62,5 KiB, 2 408 скачиваний)

Например, имеется файл с таблицей такого вида:
Данные
И необходимо получить сумму выручки не только на основании салона, но и на основании бренда. При этом делать это автоматически, например для получения данных в такую табличку:
ВПР по двум критериям
Т.е. в ячейке B2 из выпадающего списка выбирается Салон, а из B3 - Бренд(подробнее про выпадающие списки можно прочесть в статье Выпадающие списки). И в зависимости от выбора должна рассчитаться сумма Выручки и должен проставиться комментарий.
Пример
В приложенном к статье файле исходная таблица находится на листе "Отчет сентябрь", а вторая(с выбором) на листе "Выбор". На самом деле это не сильно принципиально, просто будет более понятна логика формул, приведенных ниже.
Сумму по двум критериям можно найти при помощи той же СУММЕСЛИМН(SUMIFS):
=СУММЕСЛИМН('Отчет сентябрь'!$C$2:$C$67;'Отчет сентябрь'!$A$2:$A$67;B2;'Отчет сентябрь'!$B$2:$B$67;B3)
=SUMIFS('Отчет сентябрь'!$C$2:$C$67,'Отчет сентябрь'!$A$2:$A$67,Выбор!B2,'Отчет сентябрь'!$B$2:$B$67,Выбор!B3)

Подробнее про поиск сумм по двум и более критериям можно прочитать в статье Функция СУММЕСЛИ, а так же СУММЕСЛИ по двум критериям.
А вот с комментарием сложнее - там содержится текст и СУММЕСЛИМН ничего не найдет. Да и в случае, если в исходных данных есть задвоения и суммировать по определению ничего не надо СУММЕСЛИМН будет не лучшим вариантом - ведь она вернет сумму всех ячеек, удовлетворяющих условиям. А это, повторюсь - не всегда нужно.
Здесь на помощь придет родственная с ВПР функция - ПОИСКПОЗ(MATCH):
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;ПОИСКПОЗ(B2&B3;'Отчет сентябрь'!$A$2:$A$67&'Отчет сентябрь'!$B$2:$B$67;0))
=INDEX('Отчет сентябрь'!$D$2:$D$67,MATCH(B2&B3,'Отчет сентябрь'!$A$2:$A$67&'Отчет сентябрь'!$B$2:$B$67,0))

Эта функция является формулой массива. Это означает, что вводить её в ячейки надо нажатием не просто Enter, а сочетанием трех клавиш - Ctrl+Shift+Enter. Теперь рассмотрим подробнее принцип работы этой формулы, чтобы можно было применить на любых данных. На самом деле принцип не так уж сложен. Основной упор сделан на эти две "связки":

  • B2&B3 - здесь объединяем значение выбранного Салона(Санкт-Петербург) и Бренда(Ниссан) в одну строку, чтобы получилось "Санкт-ПетербургНиссан". За объединение двух значений отвечает амперсанд(&).
  • 'Отчет сентябрь'!$A$2:$A$67&'Отчет сентябрь'!$B$2:$B$67 - а здесь мы последовательно объединяем в одну строку значения двух столбцов исходных данных - Салон и Бренд. Т.е. в результате мы получим массив объединенных значений: МоскваBMW, ВоронежBMW, СамараЛексус и т.д.(именно это объединение требует, чтобы формула вводилась как формула массива). И уже среди этих значений ищем "Санкт-ПетербургНиссан". При нахождении совпадения ПОИСКПОЗ вернет позицию строки, в которой нашел. И передаст её в ИНДЕКС. А т.к. ИНДЕКС в нашем случае возвращает значение из заданной строки указанного массива, то мы получаем требуемое.

По шагам это будет выглядеть так:

сначала искомые значения будут объединены в один
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;ПОИСКПОЗ(B2&B3;'Отчет сентябрь'!$A$2:$A$67&'Отчет сентябрь'!$B$2:$B$67;0))
=>
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;ПОИСКПОЗ(Санкт-Петербург&Ниссан;'Отчет сентябрь'!$A$2:$A$67&'Отчет сентябрь'!$B$2:$B$67;0))
=>
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;ПОИСКПОЗ(Санкт-ПетербургНиссан;'Отчет сентябрь'!$A$2:$A$67&'Отчет сентябрь'!$B$2:$B$67;0))
=>
далее так же объединяем построчно значения всех столбцов для поиска значений
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;ПОИСКПОЗ(Санкт-ПетербургНиссан;{"МоскваBMW":"ВоронежBMW":"СамараЛексус":...};0))
=>
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;4)
=>
только допы

Здесь важно следить за тем, чтобы значения в исходном массиве для поиска объединялись в том же порядке, что и искомые значения. На приложенном примере, если первым аргументом(искомое_значение) в ПОИСКПОЗ мы указали сначала Салон(B2), а потом Бренд(B3), то и вторым аргументом(просматриваемый_массив) мы должны указать два столбца в том же порядке - сначала Салон('Отчет сентябрь'!$A$2:$A$67), а уже потом Бренд('Отчет сентябрь'!$B$2:$B$67). Если их перепутать ошибки как таковой это не вызовет, но и значения найдены не будут.
Так же стоит учитывать, что такая формула будет рассчитываться дольше обычной, поэтому не стоит указывать столбцы полностью('Отчет сентябрь'!$A:$A), т.к. это может повлечь за собой расчет всего одной формулы непозволительно долгое время.
При этом очевидно, что просматривать значения можно не только из смежных столбцов, а из любых и уж точно они могут быть и первыми, и последними. И значения возвращаемые могут так же располагаться в любом столбце таблицы. И также хочу заметить, что это в примере используется только два критерия - реально их можно сделать и три, и пять, и десять. Объединяем сколько надо, указываем нужное кол-во столбцов так же с объединением и все. Но тут надо понимать, что в некоторых случаях будет оптимальнее добавить в исходные данные(те, где ищем) еще один столбец, в котором записать все данные, объединив их. Т.е. опять же на примере файла из статьи можно на листе "Отчет сентябрь" добавить формулу в столбец E: =A2&B2
и затем искать можно будет обычной формулой:
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;ПОИСКПОЗ(B2&B3;'Отчет сентябрь'!$E$2:$E$67;0))
=INDEX('Отчет сентябрь'!$D$2:$D$67,MATCH(B2&B3,'Отчет сентябрь'!$E$2:$E$67,0))

Больше нюансов, о которых я бы хотел рассказать, нет. Все стандартно, как для обычной связки ИНДЕКС(ПОИСКПОЗ.

В приложенном к статье примере приведен пример и с функцией СУММЕСЛИМН и с функцией ПОИСКПОЗ.
Скачать пример:

  Tips_All_VlookupMany.xls (62,5 KiB, 2 408 скачиваний)

P.S. Если кого-то пугает тот факт, что формулу надо вводить как формулу массива(Ctrl+Shift+Enter), то можно модифицировать формулу так:
=ИНДЕКС('Отчет сентябрь'!$D$2:$D$67;СУММПРОИЗВ(МАКС((B2='Отчет сентябрь'!$A$2:$A$67)*(B3='Отчет сентябрь'!$B$2:$B$67)*(СТРОКА($B$2:$B$67)-1))))
=INDEX('Отчет сентябрь'!$D$2:$D$67,SUMPRODUCT(MAX((B2='Отчет сентябрь'!$A$2:$A$67)*(B3='Отчет сентябрь'!$B$2:$B$67)*(ROW($B$2:$B$67)-1))))

Здесь вместо ПОИСКПОЗ роль поиска номера строки в массиве 'Отчет сентябрь'!$D$2:$D$67 играет СУММПРОИЗВ. Сам принцип работы СУММПРОИЗВ я описывал в этой статье - Функция СУММЕСЛИ, а так же СУММЕСЛИ по двум критериям. К этому могу добавить лишь некоторые разъяснения(хотя если хотите понять сам принцип - лучше потратить пару минут на статью).
(B2='Отчет сентябрь'!$A$2:$A$67) - здесь значение выбранного салона сверяется со списком салонов на листе Отчет сентябрь. Где значения равны получаем значение ИСТИНА(TRUE), где отличаются - ЛОЖЬ(FALSE).
(B3='Отчет сентябрь'!$B$2:$B$67) - здесь значение выбранного бренда сверяется со списком брендов на листе Отчет сентябрь. Где значения равны получаем значение ИСТИНА(TRUE), где отличаются - ЛОЖЬ(FALSE).
В результате перемножения этих двух выражений мы получим массив 1 и 0(1 будет там, где бренд и салон совпали, 0 - где различаются), т.к. ИСТИНА для Excel по сути =1, а ЛОЖЬ =0.
Далее полученный массив единиц и нулей перемножаем на выражение: СТРОКА($B$2:$B$67). Это выражение дает нам массив номеров строк {2:3:4:5:6:7:8 ... и т.д.}т.к. в выражении берется номер строки на листе, а нам нужен номер в диапазоне 'Отчет сентябрь'!$D$2:$D$67, то мы еще вычитаем 1(т.к. диапазон у нас начинается со второй строки). С таким же успехом можно было не вычитать, а либо все диапазоны взять с первой строки, либо указать так: СТРОКА($B$1:$B$66)
Полученный массив строк перемножаются на массив единиц и нулей салона и бренда. В результате получим номер строки, умноженный на 1 там, где салон и бренд равны искомым, и на ноль там, где отличаются. И в итоге массив номеров строки и нулей. И из этого отбирается максимальный номер строки.
По сути, это уже решает проблему поиска, но если значений, подходящих под условия больше одного, то именно такой результат может быть(даже скорее всего будет) неверным. Чтобы этого избежать мы применяем функцию МАКС(MAX), чтобы в результате из всех строк была отобрана только максимальная. Т.е. в результате мы получим не первое совпадение из всех возможных, а последнее.
Так же рекомендую ознакомиться со статьей Как просмотреть этапы вычисления формул, чтобы можно было самостоятельно поразбираться в принципах работы формул.

В сети можно найти так же решения при помощи макросов(VBA), но далеко не всегда есть возможность использовать макросы в файлах.

Также см.:
Как найти значение в другой таблице или сила ВПР
ВПР с возвратом всех значений
ВПР с поиском по нескольким листам
ВПР_МН
ВПР_ВСЕ_КНИГИ
Функция СУММЕСЛИ, а так же СУММЕСЛИ по двум критериям


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

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

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

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти
Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2018 Excel для всех   Войти