Параметризация путей к данным в Power Query

Если вы уже начали использовать в работе инструменты бесплатной надстройки Power Query в Microsoft Excel, то очень скоро столкнётесь с одной узкоспециальной, но весьма частой и надоедливой проблемой, связанной с постоянно ломающимися ссылками на исходные данные. Суть проблемы в том, что если в своём запросе вы ссылаетесь на внешние файлы или папки, то Power Query жёстко прописывает абсолютный путь к ним в тексте запроса. У вас на компьютере всё работает прекрасно, но если вы решите отправить файл с запросом своим коллегам, то их ждёт разочарование, т.к. у них на компьютере путь к исходным данным уже другой, и наш запрос работать не будет.

Что же сделать в такой ситуации? Давайте рассмотрим этот случай подробнее на следующем примере.

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

Предположим, что у нас в папке E:\Отчеты по продажам лежит файл Топ-100 товаров.xls, представляющий собой выгрузку из нашей корпоративной базы данных или ERP-системы (1С, SAP и т.п.) Этот файл содержит информацию о наиболее популярных товарных позициях и выглядит внутри примерно так:

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

С ходу, наверное, понятно, что работать с ним в Excel в таком виде практически невозможно: будут мешать пустые строки через одну с данными, объединенные ячейки, лишние столбцы, многоуровневая шапка и т.д.

Поэтому рядом с этим файлом в той же папке мы создаём ещё один новый файл Обработчик.xlsx, в котором создадим запрос Power Query, который будет загружать страшненькие данные из исходного файла-выгрузки Топ-100 товаров.xls, и приводить их в порядок:

Два исходных файла в папке

Создаем запрос к внешнему файлу

Открыв файл Обработчик.xlsx, выберем на вкладке Данные команду Получить данные - Из файла - Из книги Excel (Data - Get Data - From file - From Excel), затем укажем местоположение исходного файла и нужный нам лист. Выбранные данные загрузятся в редактор Power Query:

Загруженные данные в Power Query

Приведём их в нормальный вид:

  1. Удалим пустые строки через Главная - Удалить строки - Удалить пустые строки (Home - Remove Rows - Remove Empty Rows).
  2. Удалим ненужные 4 верхних строки через Главная - Удалить строки - Удалить верхние строки (Home - Remove Rows - Remove Top Rows).
  3. Поднимем первую строку в шапку таблицы кнопкой Использовать первую строку в качестве заголовков на вкладке Главная (Home - Use first row as header).
  4. Отделим пятизначный артикул от названия товара во втором столбце, используя команду Разделить столбец на вкладке Преобразование (Transform - Split Column).
  5. Удалим ненужные столбцы и переименуем заголовки оставшихся для лучшей наглядности.

В итоге у нас должна получиться следующая, гораздо более приятная, картина:

Приведенный в порядок файл

Осталось эту облагороженную таблицу выгрузить обратно на лист в наш файл Обработчик.xlsx командой Закрыть и загрузить (Home - Close&Load) на вкладке Главная:

Выгруженные на лист результаты запроса

Находим путь к файлу в запросе

Теперь давайте посмотрим как выглядит наш запрос "под капотом", на встроенном в Power Query внутреннем языке с лаконичным названием "М". Для этого вернемся в наш запрос двойным щелчком по нему в правой панели Запросы и подключения и на вкладке Просмотр выберем Расширенный редактор (View - Advanced Editor):

Находим путь к файлу в расширенном редакторе

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

Добавляем умную таблицу с путём к файлу

Закроем пока Power Query и вернёмся в наш файл Обработчик.xlsx. Добавим новый пустой лист и сделаем на нём маленькую "умную" таблицу, в единственной ячейке которой будет записан полный путь к нашему файлу исходных данных:

Умная таблица с путем к файлу данных

Для создания "умной" таблицы из обычного диапазона можно использовать сочетание клавиш Ctrl+T или кнопку Форматировать как таблицу на вкладке Главная (Home - Format as Table). Заголовок столбца (ячейка А1) может быть совершенно любым. Также обратите внимание, что для понятности я дал таблице имя Параметры на вкладке Конструктор (Design).

Скопировать из Проводника путь или даже ввести его вручную не представляет, конечно, особой сложности, но лучше всего минимизировать человеческий фактор и определять путь, по возможности, автоматически. Это можно реализовать с помощью стандартной функции рабочего листа Excel ЯЧЕЙКА (CELL), которая умеет выдавать кучу полезной информации об указанной в качестве аргумента ячейке - в том числе и путь к текущему файлу:

Функция ЯЧЕЙКА

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

Находим путь формулой

=ЛЕВСИМВ(ЯЧЕЙКА("имяфайла");НАЙТИ("[";ЯЧЕЙКА("имяфайла"))-1)&"Топ-100 товаров.xls"

или в английской версии:

=LEFT(CELL("filename");FIND("[";CELL("filename"))-1)&"Топ-100 товаров.xls"

... где функция ЛЕВСИМВ (LEFT) берёт из полной ссылки кусок текста до открывающей квадратной скобки (т.е. путь к текущей папке), а затем к нему приклеивается имя и расширение нашего исходного файла с данными.

Параметризуем путь в запросе

Остался последний и самый главный штрих - прописать в запросе путь к исходному файлу Топ-100 товаров.xls, сославшись на ячейку А2 нашей созданной "умной" таблицы Параметры.

Для этого вернемся в запрос Power Query и ещё раз откроем Расширенный редактор на вкладке Просмотр (View - Advanced Editor). Вместо текстовой строки-пути в кавычках "E:\Отчеты по продажам\Топ-100 товаров.xlsx" введём туда вот такую конструкцию:

Вводим путь как параметр

Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]{0}[Путь к исходным данным]

Давайте разберемся из чего она состоит:

  • Excel.CurrentWorkbook() - это функция языка М для обращения к содержимому текущего файла
  • {[Name="Параметры"]}[Content] - это уточняющий параметр к предыдущей функции, указывающий, что мы хотим получить содержимое "умной" таблицы Параметры
  • [Путь к исходным данным] - это имя столбца в таблице Параметры, к которому мы обращаемся
  • {0} - это номер строки в таблице Параметры, из которой мы хотим взять данные. Шапка - не в счет и нумерация начинается от нуля, а не от единицы.

Вот и всё, собственно.

Осталось нажать на Готово и проверить как работает наш запрос. Теперь при пересылке всей папки с обоими файлами внутри на другой ПК запрос будет сохранять работоспособность и определять путь к данным автоматически.

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



10.12.2018 12:35:39
Актуальная тема!

Формулу лучше писать, всегда на ENG (это будет работать как в Русской версии Excel так и в Английской:

LEFT(CELL("filename");FIND("[";CELL("filename"))-1)&"Топ-100 товаров.xls"

Вот этот вариант не работает в Английской из-за вставки шаблона "имяфайла":

ЛЕВСИМВ(ЯЧЕЙКА("имяфайла");НАЙТИ("[";ЯЧЕЙКА("имяфайла"))-1)&"Топ-100 товаров.xls"
10.12.2018 20:48:42
Сергей, извини конечно, но ерунду пишешь - формула на английском языке не работает в русском Excel.
10.12.2018 21:15:49
Да, Николай, ты прав я опечатался в примерах, нужно писать для русского Excel формулы на русском а шаблон на английском, вот так:

=ЛЕВСИМВ(ЯЧЕЙКА("filename");НАЙТИ("[";ЯЧЕЙКА("filename"))-1)&"Топ-100 товаров.xls"

Тогда эта формула сработает и в Английской версии Excel

У меня так было..
18.08.2023 06:17:19
Можно было бы успокоиться после замечания Николая и не усугублять......
10.12.2018 16:43:53
Николай, для себя взял на вооружение такой способ:
1) в таблицу "Параметры" формула =ЯЧЕЙКА("имя файла")
2) создаю отдельный запрос "Адрес":
let
    Источник = Excel.CurrentWorkbook(){[Name="Параметры"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Адрес", type text}}),
    #"Извлеченный текст перед разделителем" = Table.TransformColumns(#"Измененный тип", {{"Адрес", each Text.BeforeDelimiter(_, "]"), type text}}),
    #"Замененное значение" = Table.ReplaceValue(#"Извлеченный текст перед разделителем","[","",Replacer.ReplaceText,{"Адрес"}),
    Адрес = #"Замененное значение"{0}[Адрес]
in
    Адрес 
3) в качестве источника основного запроса указываю:  
Источник = Excel.Workbook(File.Contents(Адрес), null, true) 
Данный способ страхует от несанкционированного переименования файла (помогает, прежде всего, при пересылании файлов по почте и сохранении под другим именем)
10.12.2018 20:50:57
Хорошая идея. Но тогда надо добавить, что параметризация источников данных в виде явных параметров работает не во всех версиях Power Query. В последних обновлениях надо обязательно заходить в параметры и ставить там галочку Разрешить параметризацию в источнике данных - иначе будет ругаться.
12.12.2018 16:25:27
Спасибо, буду знать об этой особенности:)
10.12.2018 23:49:28
Спасибо, Николай, за очередное понятное и нужное видео.

Добавлю свой способ.
Я делаю так:
Создаю новый лист, далее так же создаю таблицу и пишу в нее формулу:
=ПОДСТАВИТЬ(ЛЕВСИМВ(ЯЧЕЙКА("имяфайла";A2);НАЙТИ("]";ЯЧЕЙКА("имяфайла";A2))-1);"[";"")
С помощью нее я получаю полный путь к файлу, включая название и расширение (при этом удаляя и заменяя лишние символы)
А потом в Power Query извлекаю этот путь так:
=Excel.Workbook(File.Contents(Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]{0}[Путь к исходным данным]),true)
Ну, собственно, и все. После этого я могу переименовывать файл, перемещать его на любые компьютеры, пересылать. Путь к файлу в ячейке изменяется автоматически каждый раз. Запрос работает всегда без вмешательства в настройки пользователя.
18.05.2020 18:53:29
Отличный способ! Спасибо!
Помогает не менять каждый раз путь к файлу и ссылается на конкретный файл, а не на все файлы с таким названием в папке и подпапках
S B
28.10.2021 12:12:22
:like:
То что искал! Спасибо!
14.02.2022 19:27:48
Огромное спасибо!!!!!
11.12.2018 13:43:47
Если нужно натравить Power Query на Web отчёт, то команда немного меняется:
Источник = Web.Page(Web.Contents(Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]{0}[Путь к отчёту])),
11.12.2018 19:51:27
А как быть, если запрос преобразован в функцию для сборки таблиц из разных файлов, и на месте жестко прописанного адреса уже стоит переменная?
16.12.2018 12:10:40
Тогда это всё надо применять к исходному запросу, получающему имена файлов, откуда собираются данные. Там тоже должен быть шаг Источник с указанной корневой папкой, по идее.
14.05.2019 19:26:22
Было бы замечательно, если напишите ролик, как параметризовать путь к папке с файлам. МНе сложно сообразить что и где исправлять (
S B
27.01.2022 14:47:43
= Folder.Files(Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]{0}[Путь])
12.12.2018 13:09:41
Николай, для себя взял на вооружение такой способ:
1) формула =ЯЧЕЙКА("имя файла" )
2) создаю отдельный запрос :


let
   Источник = Excel.CurrentWorkbook(){[Name="Путь"]}[Content],
   #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Путь", type text}}),
   #"Извлеченный текст перед разделителем" = Table.TransformColumns(#"Измененный тип", {{"Путь", each Text.BeforeDelimiter(_, "[", type text}}),
   Путь1 = #"Извлеченный текст перед разделителем"{0}[Путь]
in
   Путь1

Способ похож на спочсоб Алексея Леонтьева
13.12.2018 07:03:48
Замечательно, как раз искал решение. Теперь использую это решение для получения значений параметров отбора с ячейки листа. Спасибо.
16.12.2018 12:10:51
Не за что :)
18.12.2018 13:20:37
Николай, возможно было бы полезным добавить в текст прием как можно кнопками получить выражение:
Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]{0}[Путь к исходным данным]
Т.е. показать что при нажатии кнопки "Из таблицы" на ленте "Данные" создается кусок формулы
Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]
а добавка
{0}[Путь к исходным данным]
получается путем правого клика мыши по ячейке с адресом в редакторе запросов и выбора пункта "Детализация".
По своему опыту обучения мышкоклацающих начинающих могу сказать, что данная схема воспринимается на ура, и уже после этого легче объяснять, за что и какая функция на языке М в этом выражении отвечает.
20.12.2018 14:13:10
Алексей, собственно, в видео к этому уроку я так и делаю.
Если что, то это делается специально - чтобы текстовая и видеоверсия немного различались по деталям. Тогда народ привыкает и смотреть и читать, а значит лучше усваивает ;)
20.12.2018 14:27:03
А, пардон, видео с работы не доступно. Тогда статья+видео просто огонь!
21.02.2019 18:14:03
Мне нужно написать 150 веб запросов и в адресе запроса меняется только несколько букв. Можно ли создать умную таблицу в строках, которых будет адрес для источника запроса..а потом как то быстро создать 150 отдельных запросов, источником которых будет строка, начиная для первого запроса со 2-й строки и заканчивая 151 строкой для 150 запроса?
22.02.2019 09:11:07
Самое простое решение - включить макрорекордер и создать первый запрос вручную. Затем посмотреть код VBA и дописать к нему цикл перебора 150 ячеек и создания 150 запросов, соответственно.
Но главный вопрос: зачем вам 150 запросов?
Если вам нужно собрать данные из 150 файлов, то поместите их в одну папку и делайте импорт из нее через Данные - Создать запрос - Из файла - Из папки.
09.04.2019 12:10:37
Все здорово, вот только функция (ЯЧЕЙКА которая) очень любит ломаться, если при открытой книге с запросами открыть другую книгу...
И ведь не возвращается к исходному виду, если ломающую путь книгу закрыть. Только перерасчет спасает.
Дюже мне непонятно, в чем проблема создать параметр для функции Excel.CurrentWorkbook(), который бы формировал ссылку на папку книги.
23.08.2019 11:34:21
Добрый день! Ссылка на
отправляет на простой редизайнер таблиц
03.02.2020 17:39:55
Здравствуйте, а можно сделать это в виде макроса ?
18.02.2020 15:24:08
Добрый день!
Как применить параметрический подход к названиям листов книги Ексель?
В файлах источниках меняются имена листов - бух программа при выгрузке данных вставляет в имя листа название месяца и прочую ненужную лабуду.... Каждый месяц надо переписывать запрос.
Хорошая новость -  Книга с исходными данными всегда содержит один-единственный лист.

Пожалуйста помогите!
11.03.2020 12:54:16
Здравствуйте, Николай! Спасибо Вам за очень полезные идеи работы в Excel… Понравилась идея с параметризацией. Попытался развить эту идею в своей практике. Например, хочу, таким же образом, указывать на листе в таблице Excel параметры периода для фильтра Power Query с: «дата в ячейке A2» по: «дата в ячейке B2», которые будут при желании изменяться пользователем в отдельных ячейках A2 и B2 умной таблицы «Период».
Следуя Вашему примеру, в расширенном редакторе запросов Power Query запись:
#"Строки с примененным фильтром" = Table.SelectRows(Источник, each [#"Дата осн. документа"] >= #date(2020, 1, 10) and [#"Дата осн. документа"] <= #date(2020, 2, 15))
меняю на запись:
#"Строки с примененным фильтром" = Table.SelectRows(Источник, each [#"Дата осн. документа"] >= Excel.CurrentWorkbook(){[Name="Период"]}[Content]{0}[с:] and [#"Дата #(lf)осн. документа"] <= Excel.CurrentWorkbook(){[Name="Период"]}[Content]{0}[по:])
В итоге получаю ошибку: «Formula.Firewall: Запрос "Анализ" (шаг "Строки с примененным фильтром") ссылается на другие запросы или этапы и поэтому не может напрямую обращаться к источнику данных. Измените эту комбинацию данных.».
Подскажите, пожалуйста, что я не так делаю?
24.07.2020 01:50:56
Добрый день

Подскажите пожалуйста. В вашем случае параметр используется всего один раз для указания пути, а я хочу использовать указываемый пользователем параметр в логике настраиваемого столбца. В таблице несколько сотен тыс строк. PQ будет на каждой строке запрашивать значение параметра заново или же подобные моменты оптимизированы ? Если нет, то как быть в этой ситуации?
26.07.2020 00:26:35
Нашел ответ в книге Скульптор данных в главе ВОПРОСЫ БЫСТРОДЕЙСТВИЯ )
15.11.2020 21:02:41
Господа, есть ли соображения, как подобную параметризацию пути можно  было бы осуществить в Power BI?
15.03.2021 18:18:45
Присоединяюсь к вопросу. Возможно ли это?
17.03.2021 11:51:17
Добрый день,
Подскажите, а можно сделать так, чтобы (Дата печати документа) из ячейки А4, разместилась в столбец по всем строчкам.
Чтобы при соединении нескольких файлов, можно было идентифицировать строчки.
28.03.2021 18:17:39
Всё супер, спасибо за урок, но остался неупомянутым мелкий нюанс: после разделения столбца "Товар" на "Артикул" и "Наименование" наш разделитель (в данном случае - пробел) никуда не делся, и теперь после загрузки данных в книгу XL наименования начинаются с пробела!
Конечно, можно эту беду поправить и в таблице, но нельзя ли как-то удалить "ведущие" пробелы средствами PQ? Был бы признателен за ответ...
16.06.2021 00:42:49
Николай, спасибо за супер полезный приём!!!!
16.08.2021 09:42:22
Не пойму как этим способом (с указанием параметра) сделать единый запрос из двух источников?
Кто-нибудь подскажет?
19.08.2021 11:09:35
А можно ли использовать диспетчер имён для параметризации пути в Power Query?
03.11.2021 20:27:47
работаю в иностранной компании, там все файлы хранятся на one drive, делаю внутри файла pq зарос если я открываю  то у меня все рабоет,  открывает коллега, ей пишет  неправильное начало пути к файлу, то есть у нее путь со свеого компа у мкеня со своего. Параметизация не помогает  так  путь к файлу  по формуле ячейка определяется опредляется через внешний сервер а  внутри  pq запроса  как обычный  путь в компе. Едиственное решение при обновлении постоянно отключать синхронизцию onedrive и тогда пути становятся нормальными, но это очень не удобно . Никто не сталкивался с такой темой ?
16.12.2021 11:22:34
Добрый день.
А если название файла постоянно меняется? ("Сделки от 12.12.2021" - меняется дата в названии).
Можно ли задать примерной название файла?
(запрос на файл сделок идёт с другого файла().
S B
25.01.2022 14:42:03
Чтобы данные собирались из папки надо прописать:

= Folder.Files(Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]{0}[Путь])

Если нужно чтобы путь менялся, в зависимости где лежит ваш созданный файл PQ прописываем:
=ЛЕВСИМВ(ЯЧЕЙКА("filename"); НАЙТИ("[";ЯЧЕЙКА("filename"))-1)
27.06.2022 09:13:07
 
Добрый день, помогите пожалуйста.

Мне нужно подтянуть в PQ интернет страницу в текстовом виде,

Работает вариант
Источник = Web.Page(Web.Contents(Excel.CurrentWorkbook(){[Name="Таблица3"]}[Content]{0}[Ссылка])),

Но он подтягивает в HTML формате, мне это не подходит, мне нужно в открыть как текстовый файл


Подскажите, пожалуйста, как правильно прописать интернет путь, пробую так :

Источник = Table.FromColumns({Lines.FromBinary(Web.Contents(Excel.Workbook(File.Contents(Excel.CurrentWorkbook(){[Name="Таблица3"]}[Content]{0}[Ссылка]), null, true)))})

Вылезает такая ошибка при обновлении...

DataFormat.Error: Предоставленный путь к файлу должен быть допустимым абсолютным путем.
Сведения:
   https://www.comtermo.ru/products/radiator-bimetallicheskiy-global-style-extra-500-12-sektsiy-24917/


Заранее спасибо.
29.06.2022 08:55:57
Очень полезный урок. Хотя у вас все уроки полезные. Спасибо большое! И авторам комментариев тоже большое спасибо! Но вот незадача: В моем случае один запрос ссылается к нескольким разным папкам с файлами, а сам лежит (разумеется) в отдельной папке. Когда потребовалось перенести его вместе со всей иерархией папок на другой компьютер, запрос выдал 100% ошибок из-за смены путей расположения источников данных. Применение метода, описанного Николаем Павловым выше исправило все старые пути на новые. Но:
1. Пришлось вручную внести изменения путей к папкам с источниками данных в каждой умной таблице книги с запросом. Думаю что можно автоматизировать автоматическую выдачу новых путей с помощью формулы, предложенной S B выше от 25.01.2022 14:42:03, которую я попробую использовать в умных таблицах отдельных книг внутри каждой папки с данными, а затем буду ссылаться на них по предложенной S B  строке в каждом запросе. Проблема, которая возникла выглядит так:
let
    Источник = Excel.Workbook(File.Contents("D:\Users\***\***\Проекты\***\Внутренние\***\Путь - 1.0.xlsx"), null, true),
    Папка_Table = Источник{[Item="Папка",Kind="Table"]}[Data],
    #"Путь к папке" = Папка_Table{0}[Путь к папке]
in
    #"Путь к папке"
Суть проблемы - место расположения источника с маршрутом к папке с данными тоже будет постоянно (при переносе с одного компа на другой) меняться. Как в этом случае настроить автоматизацию путей, пока не знаю.

2.Даже после исправления всех путей к источникам данных, некоторые (связанные) запросы в книге перестают работать. Ошибка возникает на третьем шаге "Вызвать настраиваемую функцию"
let
    Источник = Folder.Files(Excel.CurrentWorkbook(){[Name="Путь"]}[Content]{0}[Путь к данным]),
    #"Отфильтрованные скрытые файлы1" = Table.SelectRows(Источник, each [Attributes]?[Hidden]? <> true),
    #"Вызвать настраиваемую функцию1" = Table.AddColumn(#"Отфильтрованные скрытые файлы1", "Преобразовать файл", each #"Преобразовать файл (5)"([Content])), 
Видимо я что-то делаю не так. А что - понять пока не могу.
18.08.2022 16:59:34
Добрый день, подскажите, пожалуйста, можно ли в строке запроса: "Excel.CurrentWorkbook(){[Name="Р_01.08.2022"]}[Content]" изменять параметр Name="Р_01.08.2022"? Если этот параметр будет собираться в ячейке умной таблицы?
09.02.2023 11:29:19
Добрый день, огромное спасибо! Применила ваш метод, но только не в отношении пути к файлу, а как путь к наименованию листа, так как файл у меня один, а листы разные, в зависимости от выбранного показателя из списка идет адресация на лист в книге.
31.07.2023 10:50:06
Здравствуйте, что нужно прописать в формуле, чтобы и путь можно было менять как в видео и можно было добавлять новые файлы с отличным именем от тех, что уже есть в папке?
24.08.2023 17:48:50
Искал готовое решение, чтобы запускать обновление таблиц, собранных через PQ, но из разных папок.

Решение из статьи помогло наполовину, остальную часть гуглил или брал из тем данного сайта, а после собирал в одно единственное целое, чтобы оно работало правильно и без ошибок.

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

Решение:
Повторяем описанное выше из статьи, только в параметрах пути прописываем так, как на скриншоте ниже:

Код:
 Источник = Folder.Files(Excel.CurrentWorkbook(){[Name="ПараметрыЗапроса"]}[Content]{0}[Путь к исходным данным]),

А дальше нам необходимо создать запрос на изменение ссылки на папку, где лежат файлы для обработчика. Для этого применяем работу VBA

Создаем новый модуль в листе или в личной книге макросов, куда закидываем следующий код:

Функция:
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
                       Optional ByVal InitialPath As String = "c:\") As String
    ' функция выводит диалоговое окно выбора папки с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
    Dim PS As String: PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show <> -1 Then Exit Function
        GetFolderPath = .SelectedItems(1)
        If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function
Сам код:
Sub ПримерИспользования_GetFolderPath()
Application.ScreenUpdating = False
Application.EnableEvents = False

    ПутьКПапке = GetFolderPath("Заголовок окна", ThisWorkbook.Path)   ' запрашиваем имя папки
    If ПутьКПапке = "" Then Exit Sub    ' выход, если пользователь отказался от выбора папки
    'MsgBox "Выбрана папка: " & ПутьКПапке, vbInformation
    Cells(2, 1).Value = ПутьКПапке

    For Each CON In ThisWorkbook.Connections
        CON.OLEDBConnection.BackgroundQuery = False 'Чтобы макрос дальше не выполнялся пока не обновится пивот.
        CON.Refresh
    Next

Dim pCache As PivotCache
    For Each pCache In ActiveWorkbook.PivotCaches
        pCache.Refresh
    Next

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub 

В случае, если существует несколько запросов (подключений) в книге и нужно обновлять конкретный, а не все подряд, можно использовать вместо этого кода: (дабы избежать ошибок обновления запросов)
For Each CON In ThisWorkbook.Connections
        CON.OLEDBConnection.BackgroundQuery = False 'Чтобы макрос дальше не выполнялся пока не обновится пивот.
        CON.Refresh 
Next 
Вот этот код, в котором необходимо будет заменить название запроса:
ActiveWorkbook.Connections("Запрос — Название запроса").OLEDBConnection.BackgroundQuery = False
ActiveWorkbook.Connections("Запрос — Название запроса").Refresh

Найти название запроса можно так:
  1. Зайти на вкладку "Данные"
  2. Выбрать "Подключения"
  3. Двойной клик на запрос
  4. Информация по запросу и его свойствах
Создаем кнопку на любой странице, привязываем к кнопке макрос с названием "ПримерИспользования_GetFolderPath"

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

Далее макрос ждет обновление запроса  из выбранной папки, после чего продолжает обновлять все сводные, которые подключены к таблице PQ в активной книге
Здесь сразу несколько решений вопросов и проблем, которые могут возникнуть параллельно этой статье.

Спасибо большое за информацию, и сайту за помощь. Решил поделиться готовым решением, вдруг кому поможет!
16.03.2024 10:39:01
У меня файл с запросом находится в сетевой папке, на файл на этом же диске но в другой папке. И запрос перестает работать если буква диска на другом комьютере (где пытаются открыть файл) отличается от моей буквы диска? подскажите вариант для моей ситуации, с файлами в разных папках..
Наверх