Период отчёта в Power Query: параметры из ячеек и проверка границ
Каждый месяц аналитик открывает Power Query и меняет две даты в фильтре. Однажды забывает обновить правую границу, и сводная за октябрь содержит только первую половину месяца. Удобнее вынести период в ячейки книги, но простая ссылка на ячейку ещё не решает проблему. Нужно проверить количество строк параметров, пустые значения и порядок границ, а затем одинаково обработать время внутри последнего дня.
Подготовить небольшую таблицу параметров
На отдельном листе создайте таблицу Excel с именем ReportParams, двумя столбцами Start и End и одной строкой. Для примера Start равен 01.10.2026, End — 31.10.2026. В ячейках храните даты, а не подписи вроде «октябрь». Вторую таблицу назовите SalesData; у неё должны быть ID, OrderAt и Amount. OrderAt содержит дату и время заказа. Имена таблиц задаются в конструкторе таблиц Excel, имена листов для кода несущественны.
Excel.CurrentWorkbook возвращает таблицы и именованные диапазоны текущей книги, поэтому запрос не зависит от абсолютного пути файла. Параметры удобно менять перед обновлением отчёта. При этом таблица должна оставаться однострочной: если кто-то добавит второй период, выбор первой строки молча проигнорирует его. Поэтому сначала проверяем форму ввода, затем преобразуем значения в даты с явной культурой.
Включить последний день целиком
Фильтр до 31 октября в полночь исключит почти все заказы последнего дня, если OrderAt содержит время. Вместо условия «меньше или равно End» используем начало следующего дня как исключительную верхнюю границу. Тогда окно включает 1 октября 00:00 и 31 октября 23:59, но исключает 1 ноября 00:00. Полуоткрытые окна также удобно стыковать между месяцами без двойного включения границы.
let
Workbook = Excel.CurrentWorkbook(),
RawParams = Workbook{[Name="ReportParams"]}[Content],
P = if Table.RowCount(RawParams)=1 then RawParams{0}
else error "ReportParams must contain exactly one row",
S = try Date.From(P[Start], "ru-RU"),
E = try Date.From(P[End], "ru-RU"),
StartDate = if S[HasError] then error "Invalid Start"
else if S[Value]=null then error "Start is required" else S[Value],
EndDate = if E[HasError] then error "Invalid End"
else if E[Value]=null then error "End is required" else E[Value],
Bounds = if StartDate > EndDate then error "Start must not exceed End"
else [Lower=DateTime.From(StartDate),
Upper=DateTime.From(Date.AddDays(EndDate,1))],
Source = if Bounds[Lower] < Bounds[Upper]
then Workbook{[Name="SalesData"]}[Content]
else error "Invalid period",
Typed = Table.TransformColumnTypes(Source,
{{"OrderAt", type datetime},{"Amount", type number}}, "ru-RU"),
Result = Table.SelectRows(Typed,
each [OrderAt] >= Bounds[Lower] and [OrderAt] < Bounds[Upper])
in
ResultПроверить границы маленькой выборкой
В пустом запросе откройте расширенный редактор, вставьте код и загрузите результат в отдельную таблицу. Для контрольной выборки добавьте в SalesData заказы на 30 сентября 23:59, 1 октября 00:00, 31 октября 23:59 и 1 ноября 00:00. В результат должны попасть только два средних. Затем поменяйте Start на дату позже End: запрос должен выдать понятную ошибку, а не пустой отчёт с убедительным нулём.
Проверьте также пустую дату и две строки параметров. Ошибка имени столбца Start или End должна исправляться в таблице, а не обходиться значением по умолчанию. Для рабочего процесса рядом с результатом полезно показывать фактически выбранный период и время обновления. Пользователь должен видеть, какие данные содержит сохранённая книга, даже если после последнего обновления кто-то уже поменял ячейки параметров.
Отдельно согласовать время источника
Пример предполагает, что даты параметров и OrderAt относятся к одному локальному календарю. Если источник хранит UTC, а отчёт строится по московским дням, сначала задайте правило перевода временной зоны и только потом сравнивайте границы. Удаление времени через Date.From у каждой строки может скрыть эту разницу. При работе с серверным источником также проверьте, переносится ли фильтр в источник: корректный результат и эффективная загрузка — отдельные вопросы.
Продолжить работу с данными
Курс «Продвинутый Excel: Power Query, Power Pivot и автоматизация отчётов» связывает подготовку источников с полным обновлением и сохранением отчёта. После настройки параметров следующий шаг — собрать модель и дашборд, в котором период, срезы и контроль итогов работают согласованно; эти задачи представлены в программе. Откройте программу платного курса «Продвинутый Excel: Power Query, Power Pivot и автоматизация отчётов».
Продолжить на практике
- Продвинутый Excel: Power Query, Power Pivot и автоматизация отчётов ↗
Научитесь собирать и обновлять рабочие отчёты в Excel. Power Query для загрузки и очистки данных, сложные формулы, Power Pivot и DAX для расчётов. Практикумы по продажам, остаткам и закупкам, план-факту подразделений.
