Вопрос или проблема
Я использую следующий запрос в Power Query Excel 2016:
let
Source = Odbc.Query("dsn=AS400", "select * from libm61.emleqpm1 where STN1 = '03' ")
in
Source
Я хочу заменить ’03’ на значение из ячейки AD2
Возможно ли это сделать?
Я считаю, что существует более удобный и дружественный подход к обеим другим ответам, который является динамичным и не создает лишних записей, кроме самих параметров:
В Excel:
- Создайте таблицу параметров:
- Перейдите на вкладку Табличные инструменты и переименуйте таблицу в Parameters.
Затем в Power Query:
- Выберите Из других источников => Пустой запрос
- Перейдите на вкладку Просмотр => Продвинутый редактор
- Замените весь код на следующий:
(ParameterName as text) =>
let
ParamSource = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
ParamRow = Table.SelectRows(ParamSource, each ([Parameter] = ParameterName)),
Value=
if Table.IsEmpty(ParamRow)=true
then null
else Record.Field(ParamRow{0},"Value")
in
Value
Наконец, нажмите Готово и переименуйте функцию в fnGetParameter.
С тех пор вы можете использовать ее – в данном случае fnGetParameter("STN1")
– в любом месте, например:
let
Source = Odbc.Query("dsn=AS400", "select * from libm61.emleqpm1 where STN1 = '" & fnGetParameter("STN1") & "'")
in
Source
Ссылка:
https://www.excelguru.ca/blog/2014/11/26/building-a-parameter-table-for-power-query/
Ответ Раджеша С уже может удовлетворить вашу потребность. Однако слабостью его ответа является то, что ваш параметр зависит от его расположения в таблице. Я предлагаю более удачное решение:
- Точно как предложил Раджеш, создайте таблицу с правильными заголовками:
- Убедитесь, что курсор находится внутри таблицы, на вкладке “Данные” нажмите “Из таблицы/диапазона”
- Сейчас вы будете в редакторе Power Query. Сначала убедитесь, что столбец “Значения” имеет тип данных “Текст”. Затем, нажмите на столбец “Имя параметра” и на вкладке “Преобразование” нажмите “Поворот столбца”. Используйте “Значение” в качестве значений. Убедитесь, что вы развернули вкладку “Дополнительные параметры” и выбрали “Не агрегировать” в качестве функции агрегирования.
- На данном этапе у вас будут разные столбцы с именем параметра в качестве названия столбца. Щелкните правой кнопкой мыши по запросу “Параметры” и нажмите “Ссылка”
- Щелкните правой кнопкой мыши по значению вашего параметра и нажмите “Просмотр”
- У вас теперь будет запрос, который можно использовать в качестве переменной из вашего листа. Используйте его в вашем ODBC-запросе:
let Source = Odbc.Query("dsn=AS400", "select * from libm61.emleqpm1 where STN1 = '"&STN1"' ") in Source
Я понимаю, что мои шаги выглядят утомительно, но я очень забывчив, поэтому мне нужно использовать описательные имена переменных, чтобы легче запомнить, что делает мой Power Query. Вы также можете выполнить шаг “Изменить тип” после поворота параметров, если хотите использовать значения ячеек для вычислений с другими запросами. Вот моя ссылка
Сейчас это намного проще сделать в последней версии Excel (O365):
Вы можете просто объявить переменную в запросе PowerQuery, используя продвинутый редактор, указать, что значение переменной должно быть получено из таблицы Excel, затем ссылаться на переменные в следующих шагах.
Например: myVar = Excel.CurrentWorkbook(){[Name="MyParameterTable"]}[Content]{0}[MyColumnName]
Так, используя таблицу параметров с ключевыми и значениями колонок, вот как я бы сделал динамическими каталог и имя файла .csv для импорта:
let
directy = Excel.CurrentWorkbook(){[Name="Param"]}[Content]{0}[Value],
newDirectory = if Text.EndsWith(directy,"\") then directy else directy&"\",
filePath = Excel.CurrentWorkbook(){[Name="Param"]}[Content]{1}[Value],
Source = Csv.Document(File.Contents(newDirectory&filePath),[Delimiter=";", Columns=2, Encoding=1252, QuoteStyle=QuoteStyle.None])
in
Source
Нет, непосредственно вы не можете использовать ссылку на ячейку. Вам необходимо создать отдельный диапазон данных и преобразовать его в таблицу.
Теперь преобразуйте этот диапазон в таблицу и присвойте ей имя, например, ParaTAB или ParameterTAB, тогда ваша команда будет выглядеть так:
let
Source = Odbc.Query("dsn=AS400", "select * from libm61.emleqpm1 where STN1 = ParaTAB[Value]{2} ")
in
Source
Здесь Power Query возьмет третье значение или третью строку, что является ADM, поскольку отсчет идет с 0.
Примечание: Помните, что B6 и A2 — это ссылки на ячейки.
Ответ или решение
Использование значения ячейки в качестве параметра в Power Query может существенно снизить трудозатраты при обработке данных и создать гибкость в процессах отчетности. В Excel 2016, без прямой возможности ссылки на отдельные ячейки из Power Query, существует несколько способов решения этой задачи. Мы разберем концепцию, предложим конкретные примеры и применим их на практике.
Теоретическая часть
Power Query в основном предназначен для импортирования данных и их трансформации. В рамках этого процесса очень важно иметь возможность динамически управлять параметрами, такими как критерии отбора, строки подключения или пути к файлам. Это особенно актуально для сложных запросов, работающих с большими объемами данных или использующих внешние источники, такие как базы данных AS400.
Основная идея заключается в создании таблицы параметров, которая будет хранить значения, используемые в запросах. Это позволяет легко изменять параметры, просто обновляя значения в таблице. Таким образом, несмотря на отсутствие прямой ссылки на ячейку, мы можем динамически управлять параметрами через Power Query.
Пример
Рассмотрим пошаговый процесс:
-
Создание таблицы параметров в Excel:
- Заполните таблицу в Excel, например, с заголовками "Параметр" и "Значение".
- Внесите необходимые значения параметров. Например, STN1 = ’03’.
- Выделите диапазон и преобразуйте его в таблицу, присвоив ей имя, например, "Parameters".
-
Создание функции в Power Query для извлечения значения параметра:
-
В Power Query выберите "Из других источников => Пустой запрос".
-
Перейдите в "Просмотр => Продвинутый редактор" и вставьте следующий код:
(ParameterName as text) => let ParamSource = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content], ParamRow = Table.SelectRows(ParamSource, each ([Параметр] = ParameterName)), Value = if Table.IsEmpty(ParamRow) then null else Record.Field(ParamRow{0}, "Значение") in Value
-
Нажмите "Готово" и дайте функции имя, например, "fnGetParameter".
-
-
Использование параметра в вашем запросе:
-
В вашем запросе ODBC в Power Query замените фиксированное значение параметра на вызов функции fnGetParameter:
let Source = Odbc.Query("dsn=AS400", "select * from libm61.emleqpm1 where STN1 = '" & fnGetParameter("STN1") & "'") in Source
-
Применение
Теперь при изменении значения в ячейке таблицы, Power Query автоматически использует это обновленное значение в ходе выполнения запроса. Такой подход не только упрощает управление параметрами, но и делает отчеты более адаптивными к изменениям требований. Если вы работаете в команде, это также обеспечивает централизованное управление параметрами, снижая вероятность ошибок и увеличивая согласованность данных.
Кроме того, если вам необходимо использовать несколько параметров, их можно легко добавить в таблицу и использовать аналогичным способом для получения множества значений. Это может быть полезно в сценариях, где отчетность меняется в зависимости от внешних факторов, таких как финансовые кварталы, филиалы или диапазоны дат.
Заключение
Использование таблиц параметров в Power Query — это мощный способ наладить динамическое управление импортом и обработкой данных. Несмотря на отсутствие прямых ссылок на ячейки, этот метод предоставляет широкие возможности для адаптации и гибкости, что особенно важно при работе с большими наборами данных или при частых изменениях требований к отчетности. Таким образом, данное решение позволяет автоматизировать множество рутинных задач и сосредоточиться на аналитике и интерпретации данных.