Power Query Fill Down: как не перенести значение через границу блока
Выгрузка содержит несколько накладных. В первой строке каждой указан склад, ниже идут товары с пустыми ячейками склада. Команда «Заполнить вниз» выглядит очевидным решением. Но у второй накладной склад вообще не заполнен. Если применить команду ко всей таблице, она получит склад первой накладной, и отчёт уверенно отправит товар не туда. Для безопасного заполнения нужно сохранить границы документов.
Сделать принадлежность строки явной
Нужен идентификатор документа или блока, который есть у каждой строки. В примере Block равен 1 для первой накладной и 2 для второй, Row хранит исходный порядок. У первой накладной склад North указан в первой строке, у второй обе строки пустые. Ожидаемый результат: North заполнится только внутри первого блока, а во втором останется null. Эта пустота полезна: она показывает документ, который нужно исправить в источнике.
Если номера документа есть лишь в заголовках блоков, сначала извлеките их по устойчивому признаку строки заголовка и назначьте всем позициям соответствующий ключ. Нельзя строить блоки только по непустому складу: тогда документ без склада вообще не получит собственной границы. Для файлов из папки составной ключ часто включает имя файла и номер блока; одинаковые номера накладных в разных выгрузках не должны случайно объединяться.
Заполнить отдельно внутри каждой группы
Создайте пустой запрос в Power Query, откройте расширенный редактор и вставьте самодостаточный пример. Он группирует строки по Block, сортирует позиции внутри группы, выполняет FillDown и разворачивает результат. Последняя сортировка возвращает исходный порядок всей выгрузки. Она нужна отдельно: группировка не обещает сохранить порядок возвращаемых строк.
let
Source = #table(
type table [Block=Int64.Type, Row=Int64.Type, Warehouse=nullable text, Qty=number],
{{1,1,"North",2},{1,2,null,3},{2,3,null,4},{2,4,null,5}}
),
Groups = Table.Group(Source, {"Block"}, {
{"Rows", each Table.FillDown(
Table.Sort(_, {{"Row", Order.Ascending}}), {"Warehouse"})}
}),
Expanded = Table.ExpandTableColumn(Groups, "Rows",
{"Row","Warehouse","Qty"}, {"Row","Warehouse","Qty"}),
Result = Table.Sort(Expanded, {{"Row", Order.Ascending}})
in
ResultРазличить null и текст, который выглядит пустым
FillDown распространяет значение в ячейки null. Пустая строка и строка из пробелов — текстовые значения, и поведение будет другим. Если источник использует такие ячейки как пропуски, перед группировкой приведите их к null после согласованной очистки пробелов. При этом не превращайте осмысленный код склада вроде «0» в отсутствие значения. Правило очистки должно относиться к конкретному столбцу, а не ко всем данным подряд.
После заполнения в примере склады равны North, North, null, null. Количество строк остаётся четырём, сумма Qty — четырнадцати. Проверьте обе инварианты на своей выгрузке: разворачивание вложенных таблиц не должно ни потерять позиции, ни продублировать их. Затем отдельно отберите блоки с оставшимся null и передайте владельцу данных. Заполнять их первым встреченным складом другого документа нельзя.
Не дать обновлению незаметно поменять смысл
Проверьте случай, когда в одном документе появляется два разных склада. Возможно, это нормальные подблоки, и тогда нужен более подробный ключ. Возможно, это ошибка ввода, которую надо остановить до заполнения. Полезно посчитать число различных непустых складов на Block и отдельно разобрать значения больше одного. Иначе последний встретившийся склад будет распространяться дальше по правилу, которое пользователь отчёта мог не ожидать.
Для рабочего запроса замените только Source на подготовленную таблицу с ключом блока и порядком строк. Сохраните эти технические столбцы до проверки результата, даже если затем уберёте их из итоговой сводной. При новом формате файла они помогут быстро найти, на каком документе разошлись границы. Так заполнение вниз становится проверяемой операцией внутри документа, а не молчаливой догадкой по соседней строке.
Продолжить работу с данными
Следующий шаг — включить очистку в обновляемый отчёт. Курс «Продвинутый Excel: Power Query, Power Pivot и автоматизация отчётов» разбирает подготовку данных Power Query и практикумы по остаткам и закупкам. Вы сможете связать правила очистки с таблицами модели и проверкой итогов, чтобы ошибка склада не прошла в сводную. Откройте программу платного курса «Продвинутый Excel: Power Query, Power Pivot и автоматизация отчётов».
Продолжить на практике
- Продвинутый Excel: Power Query, Power Pivot и автоматизация отчётов ↗
Научитесь собирать и обновлять рабочие отчёты в Excel. Power Query для загрузки и очистки данных, сложные формулы, Power Pivot и DAX для расчётов. Практикумы по продажам, остаткам и закупкам, план-факту подразделений.
