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

Ниже будет пост о том, каким еще извращенным способом можно надругаться над excel и вытащить данные из другой таблицы по нестандартным условиям без регистрации и смс дополнительных фишек типа VBA и т.п., только штатный функционал excel.

Итак, что мы имеем:

Таблица раз - со списком значений, который надо обогатить данными

Таблица, которую будем обогащать
Таблица, которую будем обогащать

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

Фрагмент таблицы, откуда будем вытаскивать данные
Фрагмент таблицы, откуда будем вытаскивать данные

Обычная задача для ВПР или ИНДЕКС звучит, как "мне надо добавить данные из одной таблицы в другую по какому-то критерию или критериям", после чего берем критерий первой таблицы и начинаем искать по нему первое совпадающее значение из другой таблицы и возвращаем значение из искомого столбца:

=ВПР(A2;Лист2!$C$1:$C$170;2;0), где A2 - критерий, Лист2!$C$1:$I$13 - диапазон в котором ищем, 2 - номер столбца, из которого  возвращаем значение, 0 - тип сопоставлениятип 

или вот так:

=ИНДЕКС(Лист2!$B$1:$I$170;ПОИСКПОЗ(Лист1!A3;Лист2!$C$1:$C$170;0);3), где - Лист2!$B$1:$I$170 - диапазон, в кокотором ищем, ПОИСКПОЗ(Лист1!A3;Лист2!$C$1:$C$170;0) - строка, которую ищем, 3 - столбец, откуда возвращаем данные,  

В целом двух этих формул хватит для 90% ситуаций при работе с excel, чтобы подтянуть данные из другой таблицы. Хватит ровно до того момента, пока к нам не присоединится условие с датой, при этом дата будет неизвестной переменной.

Собственно сама задача:

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

То есть мы оперируем идентификатором и условием, что дата должна быть самая поздняя из возможных записей с совпадающими идентификаторами. Когда меня попросили изобразить это в excel, я сначала начал думать в сторону VBA, так как Googlение проблемы приводило в основном к примерам, как искать записи по нескольким критериям, то есть из исходной таблицы мы берем эти несколько критериев и пытаемся по ним найти соответствующие записи в другой таблицы. Эти варианты не подходили, так как определение последней даты записи должно было происходить также в формуле, и заранее ее значение было неизвестно, ну и плюс она должна быть определена для записей с конкретным идентификатором. VBA тоже не походил, так как человеку надо было отправить просто формулу, чтобы можно было вставить в ячейку.

В итоге с помощью того Googlа и небольшой доработки напильником была рождена формула следующего типа:

{=ИНДЕКС(Лист2!$B$2:$I$170;ПОИСКПОЗ(A4&МАКС(ЕСЛИ(A4=Лист2!$C$2:$C$170;Лист2!$B$2:$B$170;""));Лист2!$C$2:$C$170&Лист2!$B$2:$B$170;);ПОИСКПОЗ("Статус";Лист2!$B$1:$I$1;0))}

Вот он - ВПР на максималках) тут использовано все, чтобы вернуть ту искомую запись в таблице: и массивы, и индекс, и несколько критериев, и условие по дате.
Как это работает:

  1. Используем в формуле ИНДЕКС массивы. При вводе формулы используем сочетание клавиш ctrl+shift+enter

  2. Выделяем просматриваемый диапазон, в моем случае от B2 до I170

  3. Искомую строку определяем по формуле ПОИСКПОЗ, при этом поиск осуществляем по двум условиям A4&МАКС (идентификатор A4 исходной таблицы и максимальное значение даты при равном идентификаторе, значение даты берется из функции ЕСЛИ). Тут важно не забыть, что поиск по нескольким критериям можно задать через & перечислив критерии, а также надо через & перечислить диапазоны, в которых excel будет искать эти критерии, в той же последовательности, что и критерии

  4. Искомый столбец оформил тоже через формулу ПОИСКПОЗ, где формула ищет позицию искомого значения "Статус" в просматриваемом диапазоне заголовков второй таблицы и возвращает таким образом номер столбца, из которого нам надо вытащить значение

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

Итоговый результат
Итоговый результат

Зачем этот пост?

Хотел поделиться в сети информацией для будущих искателей решения схожей проблемы, так как мой ТОП операций и функций excel ctrl+c и ctrl+v :) Но мне не подвернулось готового решения, когда я искал. Может кому-то повезет больше с моей помощью.

Комментарии (7)


  1. vdo2000
    25.07.2022 10:16

    Вот чтобы такой, извините, фигней не страдать создатели SQL сделали ID-записи первым значением в строке


    1. Akina
      25.07.2022 10:59
      +2

      Вот то есть совсем не догма. Местоположение поля ID в структуре не влияет вообще ни на что. А если имеется позиционная зависимость - то есть серьёзные погрешности в архитектуре.

      К тому же первичный ключ бывает и композитным.


    1. FThemAll Автор
      26.07.2022 11:56

      решение должно было быть максимально простым для обычного пользователя Excel, и да, место ID тут не спасло бы даже в SQL


  1. Ad_fesha
    25.07.2022 10:44
    +2

    Добрый день


    "Хотел поделиться в сети информацией для будущих искателей решения схожей проблемы "

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

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

    ИМХО

    ПЫ СЫ - тем не менее, формулы массива - даже среди бывших коллег аналитиков - встречал не часто. Поздравляю с решением! (без сарказма). Тем не менее - если интересны еще варианты решения задачи - рекомендую посетить сайт что оставил выше - продублировать решение на нем. Думаю Вас сумеют удивить...)


    1. FThemAll Автор
      26.07.2022 11:47

      Приветствую! Так и не разобрался, то ли похвалили, то ли поругали)) про сайт, о котором написали, я знаю. Действительно, крутой тематический ресурс (наверное, единственный в своем роде в рунете). Его я также прошестрил в поисках ответа, но в моей задачке были нюансы, которые надо было решить раньше, чем написать вопрос на форуме. Но почему Хабр? Если выбирать из двух ресурсов, то Хабр - независимое сообщество ИТ и тех, кто рядом, а ваш пример - это все же персональный сайт классного специалиста.
      Вашу критику услышал, но не до конца понял. То есть подобный контент не для Хабра и лучше публиковать на других ресурсах?


  1. tarsv83
    25.07.2022 11:22
    +1

    PowerQuery не проще было использовать?


    1. FThemAll Автор
      26.07.2022 11:52

      я перебирал в голове варианты от SQL до PQ, в промежутках думая о VBA, но для неподготовленного человека была бы шоком предварительная настройка для достижения результата, а формулу можно скопипастить в любой файл)