如何从文本文件加载PQ功能

时间:2019-06-30 11:33:22

标签: excel powerquery

就像在VBA中一样,我们可以在.xlam文件中保存函数宏,然后将其加载到另一个文件中。在电源查询中,我想将常用功能存储在中央位置,并在必要时引用这些位置。

我知道我们可以通过遵循this guide来存储功率查询,以供以后使用。

但是,本技巧不适用于功能。

假设我有一个非常简单的函数来获取Excel范围的值:

(RangeName as text) =>
let
  RangeValue = Excel.CurrentWorkbook(){[Name=RangeName]}[Content]{0} [Column1]
in
  RangeValue

我尝试如下链接到该文件:

(RangeName as text) =>
  let
  GetFunction = Text.FromBinary(File.Contents(Excel.CurrentWorkbook(){[Name="PQMacrosFolder"]}[Content]{0}[Column1]&"RangeValue.txt")),
  EvaluateFunction = Expression.Evaluate(GetFunction, #shared)
in
  EvaluateFunction

(您看到我正在使用函数本身的语法从名为范围“ PQMacrosFolder”的Excel中获取文件夹路径。)

它显示该函数已正确加载到查询编辑器中。 enter image description here

但是当我尝试输入一些测试值并调用该函数时,它只会再次显示相同的函数屏幕。 enter image description here

2 个答案:

答案 0 :(得分:0)

这里是从文本文件加载功能并对列执行操作的功能。该功能是从文本文件加载的,并且输入是在同一查询中设置的。假设输入变量是在两个单独的查询中定义的(也如下所示)。

请注意,如果出现Formula.firewall错误,则需要将命名范围值写入同一查询或更改查询选项以忽略隐私设置。为了便于阅读,我更愿意将它们分开。

let

    //Load M code from text file

    Source = Text.FromBinary(File.Contents(p_myTextFilePath)),

    //Evaluate the code from the file as an M expression
    EvaluatedExpression = Expression.Evaluate(Source, #shared),    

    //Invoke Function
    InvokeFunction = EvaluatedExpression(p_myTableName)

in

    InvokeFunction

查询以获取用作文本文件路径和表名称(作为命名范围)的值。

p_myTableName查询

let
    Source = Excel.CurrentWorkbook(){[Name="nr_myTableName"]}[Content],
    Column1 = Source{0}[Column1]
in
    Column1

p_myTextFilePath查询

let
    Source = Excel.CurrentWorkbook(){[Name="nr_myTextFilePath"]}[Content],
    Column1 = Source{0}[Column1]
in
    Column1

enter image description here

版本1

以下是从文本文件加载功能的功能语法。表名是文本文件中函数的参数,因此,当您调用下面的函数时,将显示文本文件中的函数,准备表规范。

(myTextFilePath) =>

let

    //Load M code from text file

    Source = Text.FromBinary(File.Contents(myTextFilePath)),

    //Evaluate the code from the file as an M expression

    EvaluatedExpression = Expression.Evaluate(Source, #shared)    

in

    EvaluatedExpression

这是上面的函数在被调用之前的屏幕截图。

enter image description here

这是调用函数后的另一个屏幕快照,准备指定下一个参数。

enter image description here

答案 1 :(得分:0)

我尝试过,看起来如果我只调用一次函数,它将再次显示相同的函数屏幕。但是,如果我再次调用结果步骤,它将起作用。

  let
Source = RangeValue("PQMacrosFolder"),
Source2 = Source("PQMacrosFolder")
  in
Source2

enter image description here

或者等效地,在链接到文本文件的查询中两次调用它。

(RangeName as text) =>
  let
GetFunction = Text.FromBinary(File.Contents(Excel.CurrentWorkbook(){[Name="PQMacrosFolder"]}[Content]{0}[Column1]&"RangeValue.txt")),
EvaluateFunction = Expression.Evaluate(GetFunction, #shared),
EvaluateFunction2 = EvaluateFunction(RangeName)
  in
EvaluateFunction2

如果有人可以进一步解释这一点,那就太好了。