Поиск и подстановка с учётом периода

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

Поиск и подстановка данных из одной таблицы в другую по совпадению ключевых значений в общих столбцах - это классическая задача, с которой сталкивается любой пользователь Microsoft Excel. Решить её можно множеством разных способов: функциями ВПР (VLOOKUP) или ПРОСМОТРХ (XLOOKUP), с помощью Power Query и т.д.

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

Исходная задача

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

  • в клиентской базе у людей иногда меняются контактные данные
  • служебный автомобиль может быть закреплён сначала за одним сотрудником, а потом - за другим, третьим...
  • в разные периоды времени могут действовать различные рекламные акции и скидки
  • и т.д.
В проектировании баз данных подобные случаи, кстати, принято называть медленно меняющимися измерениями (slowly changing dimensions = SCD).

Требования к справочнику

Прежде, чем начинать, стоит явно озвучить требования к справочнику, откуда мы тянем данные. Чтобы все описанные далее способы успешно работали, для него должны выполняться следующие условия:

  • в пределах одной категории (товара) временные интервалы не должны пересекаться (иначе будет конфликт цен)
  • в нём должен быть столбец с уникальным номером каждой строки (будет нужен нам далее)
  • пустые ячейки в столбце Финиш для цен, которые действуют в данный момент, нужно заполнить текущей датой - например, с помощью автоматически обновляющейся функции СЕГОДНЯ (TODAY).

Способ 1. Подстановка чисел функцией СУММЕСЛИМН

Если данные, которые нам нужно подтянуть из справочника представляют из себя числа (как в случае с ценами), то наша задача решается функцией СУММЕСЛИМН (SUMIFS) с тремя условиями:

  • товар совпадает с проданным,
  • дата продажи после даты начала,
  • дата продажи до даты конца

Подстановка за период с СУММЕСЛИМН

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

Способ 2. Подстановка текста

Если же из справочника необходимо извлечь не числовые, а текстовые данные (например, страну поставщика), то формула чуть-чуть усложняется - можно сначала предыдущей формулой найти порядковый номер строки (столбец ID), который нам нужен, а уже потом с помощью функции ИНДЕКС (INDEX) вытащить из столбца Поставщик требуемое по порядку значение. 

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

Поиск и подстановка текстовых значений за период

Способ 3. Новая функция ФИЛЬТР

Если вы используете версию Excel 2021 или новее, то можно решить задачу чуть более изящно - использовать новую функцию ФИЛЬТР (FILTER) с теми же тремя условиями: название товара совпадает с исходным, дата продажи попадает между стартом и финишем. Чтобы все эти три условия работали одновременно (т.е. в связке AND между собой), их нужно перемножить во втором аргументе функции ФИЛЬТР:

Функция ФИЛЬТР

Способ 4. Power Query

Принципиально другой способ решения нашей задачи с подтягиванием данных из медленно меняющегося измерения - это использовать объединение запросов Power Query. Алгоритм действий будет следующим:

  1. Конвертируем по очереди обе таблицы в динамические "умные" сочетанием клавиш Ctrl+T или используя команду Главная - Форматировать как таблицу (Home - Format as Table)
  2. Загружаем их в Power Query командой Данные - Из таблицы/диапазона (Data - From Table/Range) и сохраняем как подключения через Главная - Закрыть и загрузить - Закрыть и загрузить в - Только создать подключение (Home - Close&Load - Close&Load to - Only create connection). Если лень делать это всё вручную, то можно воспользоваться готовым макросом из моей надстройки PLEX.
  3. Дополнительно в запросе, который загружает прайс заменяем пустые ячейки в столбце Финиш на любую дату, щёлкая по шапке столбца правой кнопкой мыши и выбирая команду Замена значений (Replace values). Затем в строке формул можно будет вручную заменить жёстко прописанную дату вида #date(2026,3,5) на функцию обновляемой текущей даты языка М DateTime.LocalNow() - аналог функции СЕГОДНЯ() в Excel.
  4. Объединяем обе таблицы по товару через Данные - Получить данные - Объединить запросы - Объединить (Data - Get data - Merge queries - Merge). Выделяем в обеих таблицах столбец с наименованием в качестве ключевого и жмём ОК.
  5. Разворачиваем вложенные таблицы в добавившемся после слияния столбце с помощью кнопки с двойной стрелкой в шапке. Помечаем галочками все столбцы кроме наименования - оно у нас в таблице уже есть.
  6. Фильтруем по столбцу Дата продажи строки, попадающие между любыми двумя датами.
  7. Исправляем М-код в строке формул, чтобы отфильтровались те строки, где дата продажи попадает между датами из столбцов Старт и Финиш вместо жёстко прописанных дат-констант:
Фильтрация попадания между Старт и Финиш

Задача решена! Останется лишь выгрузить результаты на новый лист, используя команду Главная - Закрыть и загрузить (Home - Close & Load).

Ссылки по теме




21.03.2026 11:11:28
Спасибо, мне бы лет 10 назад такой урок не помешал (впрочем, и сегодня актуален).
Я занимаюсь тарификацией телефонного трафика и там тоже приходится находить данные по подходящей дате из справочников. Помню, ещё в группе на фейсбуке (внесён в список запрещённых организаций в России) мне подсказали способ связывания таблицы фактов и таблицы справочника с несколькими датами через PowerPivot. Но у меня не было столбца Финиш, приходилось отбирать по признаку "текущая дата >= максимальное значение даты из дат справочника, которые меньше или равны текущей дате в таблице фактов". В общем, всю голову сломал, пока удалось связать таблицы в модели данных по составному ключу.
Надо будет попробовать ваш способ в Power Query.
24.03.2026 10:26:08
Отлично,
вроде бы всё уже знаешь,
но каждый раз находится всё новые и новые мелочи, которые всегда нужны в "самый не подходящий момент" )
25.03.2026 13:29:54
"Периодические реквизиты" в терминах 1С...
25.03.2026 16:32:16
А как найти значение, если период еще не закрыт? Т.е. прайс еще действующий
Как бы можно конечно подставить в столбец "Финиш" что-то типа такого =ТДАТА()+10. Но возможно есть какой-то более элегантный способ, чтобы ячейка оставалась пустой и таким образом видно было, что период еще не закрыт
27.03.2026 11:40:38
Пустые ячейки в столбце Финиш справочника нужно обязательно заполнить текущей датой. В статье и в видеоролике этот момент особо оговаривается - посмотрите внимательнее.
Наверх