Ссылка на конкретную ячейку в Power Query

Если начинаете работать с данными в Power Query, то очень быстро привыкаете мыслить не ячейками и их адресами а-ля "морской бой" (как в Excel), а столбцами и целыми таблицами, т.к. именно ими и оперирует Power Query. Тем не менее, с завидной регулярностью могут возникать ситуации, когда при работе в Power Query нам нужно ссылаться именно на конкретные отдельные ячейки в наших данных. Реализовать такое, на самом деле, несложно - особенно, если вам не страшно копнуть чуть глубже интерфейса Power Query, в язык М, который работает у него "под капотом".

Рассмотрим в качестве примера следующий сценарий. Предположим, что мы собираем отчеты от руководителей филиалов нашей компании в общей папке. Внутри эти отчёты выглядят следующим образом:

Исходные данные

Обратите внимание на следующие моменты:

  • имена листов везде одинаковые (Лист1);
  • название филиала (город) всегда расположено в ячейке А4;
  • положение ячейки с именем руководителя филиала - плавающее и зависит от количества строк данных в каждом файле

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

Желаемый результат

Давайте разберём весь процесс пошагово.

Шаг 1. Собираем файлы из папки

Первичная сборка данных из всех отчётов выполняется совершенно стандартно с помощью команды Данные - Получить данные - Из файла - Из папки (Data - Get data - From file - From folder). Затем в появившемся окне нужно выбрать Лист1, который мы хотим извлечь из каждого файла и нажать кнопку Преобразовать данные (Transform data):

Собираем файлы

Затем нажимаем кнопку с двойными стрелками Объединить файлы в заголовке столбца Content, чтобы извлечь их содержимое, выбираем нужный нам лист (Лист1) и жмём на ОК:

Объединяем данные с Лист1 из всех файлов

Как обычно в таких случаях, Power Query действует по следующему алгоритму:

  1. Берёт первый файл из папки в качестве примера и создаёт параметр.
  2. Создаёт автоматический запрос Преобразовать пример файла (Transform sample file), где извлекает данные из файла-примера.
  3. Создаёт функцию и применяет её к каждому файлу на шаге Вызывать настраиваемую функцию (Invoke custom function), формируя новый столбец с результатами работы этой функции в виде вложенных таблиц.
  4. Удаляет все лишние столбцы и разворачивает содержимое вложенных таблиц, соединяя данные из всех файлов в единое целое.
Грязные результаты

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

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

Во-первых, удаляем шаг Измененный тип (Changed type) и шаг повышения заголовков - они тут совершенно ни к чему. 

Во-вторых, к получившемуся исходному виду данных нам в будущем придётся обращаться повторно, так что удобнее будет создать новый шаг, нажав на кнопку fx в строке формул и переименовать его (клавишей F2 или правой кнопкой мыши) любым подходящим именем - например База.

Шаг "База"

После этого можно удалить лишние "мусорные" строки - 5 сверху и 3 снизу, используя команды Главная - Удалить строки - Удалить верхние/нижние строки (Home - Remove rows - Remove top/bottom rows). Первую строку нужно будет поднять в шапку там же - кнопкой Использовать первую строку в качестве заголовков (Use first row as headers). В итоге наша табличка должна принять следующий цивильный вид:

Исправленная таблица из примера

Шаг 2. Извлекаем фиксированный город

Дальше самое интересное. Чтобы добавить к нашим данным столбец с названием города, нам нужно суметь обратиться к ячейке А4 и извлечь её содержимое. Для этого нам нужно понять, как Power Query формирует ссылку на конкретную ячейку, например для ячейки с городом это будет:

=База[Column1]{3}

Она состоит из трёх блоков:

  • таблица, т.е. имя переменной (шага), где хранится исходная таблица - в нашем случае это шаг База
  • имя столбца в квадратных скобках - у нас это [Column1]
  • номер строки в фигурных скобках (считая с нуля) - у нас город лежит в 4-й строке, так что это будет 3

Теперь можно добавить новый вычисляемый столбец командой Добавление столбца - Настраиваемый столбец (Add column - Custom column) и ввести туда эту формулу. После нажатия на ОК мы увидим колонку с названием филиала:

Извлекаем город в отдельный столбец

Шаг 3. Извлекаем плавающего руководителя

Аналогичным образом добавим настраиваемый столбец и для извлечения имени руководителя филиала. Но тут надо вспомнить, что строка с именем руководителя у нас плавающая, так что её номер в фигурных скобках нужно не прописывать жёсткой константой, а вычислять для каждого файла. В этом нам может помочь функция языка М List.PositionOf - аналог экселевской ПОИСКПОЗ (MATCH). С её помощью мы можем найти позицию словосочетания "руководитель филиала" в первом столбце наших данных - это и будет искомый номер строки для последующего извлечения ФИО руководителя из третьей колонки.:

Используем функцию List.PositionOf

У функции List.PositionOf задаём следующие аргументы:

  • исходный список, где мы ищем совпадение - в нашем случае это первый столбец в наших данных, т.е. База[Column1]
  • искомое значение, т.е. "руководитель филиала";
  • порядковый номер вхождения, которое нам нужно (считая с нуля) - ищем первое вхождение, поэтому ставим 0;
  • нужно ли учитывать регистр при поиске - не нужно, поэтому используем Comparer.OrdinalIgnoreCase

Теперь номер плавающей строки, откуда мы берём ФИО руководителя будет вычисляться для каждого файла.

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

Итоговый результат сборки

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




01.06.2026 10:11:14
Спасибо за урок и еще одну возможность упростить себе жизнь на работе!
01.06.2026 18:32:47
Спасибо! На работе пока пользуюсь экселем. Очень помогают Ваши видеоуроки автоматизировать работу. И было бы здорово дополнительно в этих уроках показать, как код на VBA переписать на Lua.
02.06.2026 18:25:50
попробуйте использовать gpt
05.06.2026 11:49:06
Если задача стоит так, что у нас произвольное количество столбцов и нужно удалить все столбцы правее столбца, содержащего определённое значение, то как это сделать? Пока что решение видится таким, что нужно транспонировать таблицу и тогда работать со столбцами как со строками, транспонировав таблицу обратно после удаления лишних столбцов (строк). Может есть какая более изящная альтернатива этому способу?
08.06.2026 18:44:50
задайте вопрос на форуме, приложите файл-пример и ответ не заставит себя ждать.
08.06.2026 19:10:59
Сначала надо определить номер столбца, где находится нужное вам значение. Например, если мы ищем слово "Вася" во второй строке, то это можно сделать командой:
n = List.PositionOf( Record.ToList( Источник{1} ), "Вася" )

После этого можно удалить все столбцы правее n командой:
 = Table.SelectColumns(Источник, List.FirstN(Table.ColumnNames(Источник), n))
09.06.2026 08:01:44
Николай, спасибо!
08.06.2026 18:36:44
Про 3й аргумент List.PositionOf (occurrence) автор немного нафантазировал (см по таймингу примерно с 11:10). Это не есть "какой по счету руководитель нам нужен". См спецификацию по List.PositionOf.
08.06.2026 19:02:56
Спасибо за уточнение - почему-то интуитивно решил, что это именно порядковый номер :D
Наверх