就像在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中获取文件夹路径。)
答案 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
版本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
这是上面的函数在被调用之前的屏幕截图。
这是调用函数后的另一个屏幕快照,准备指定下一个参数。
答案 1 :(得分:0)
我尝试过,看起来如果我只调用一次函数,它将再次显示相同的函数屏幕。但是,如果我再次调用结果步骤,它将起作用。
let
Source = RangeValue("PQMacrosFolder"),
Source2 = Source("PQMacrosFolder")
in
Source2
或者等效地,在链接到文本文件的查询中两次调用它。
(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
如果有人可以进一步解释这一点,那就太好了。