所以,我有很多类似的工作簿,它们连接到一种特殊的数据库工作簿。每次,当我在数据库工作簿中添加包含新表的工作表时,我需要在所有工作簿(连接到数据库)中向该表添加新的 Power Query 连接。
如图所示,我必须手动设置与每个表的连接。 有没有办法动态获取数据库工作簿中的所有表,但不使用 VBA 宏?
您问是否有一种方法无需 VBA 即可获取所有表。
是的。
Excel.Workbook(File.Contents(DbFilePath), null, true)
返回包含以下列的表格:
这意味着您可以使用类似代码进行名为“fGetDbTable”的查询
let
DbFilePath = "FilePathGoesHere",
dbFile = Excel.Workbook(File.Contents(DbFilePath), null, true),
OnlyTables = Table.SelectRows(dbFile, each [Kind] = "Table")
in
(TableName as text) as nullable table => try OnlyTables{[Name = TableName]}[Data] otherwise null
您可以通过
fGetDbTable(TableName)
获取数据库工作簿中任何现有表的值
您的问题的答案意味着您不必为要使用的数据库中的每个表添加新的 PowerQuery 连接,但无论如何您仍然想做一些事情,对吧?
考虑一下:
Expression.Evaluate(
"fMyTest({1,2,3})",
[
fMyTest = (nums as list) => Text.Combine("Sum is ", Text.From(List.Sum(nums)), "!")
] & #shared
)
#shared
是当前上下文、代码可用的所有参数、查询和函数。基本上,这会导致 "fMyTest({1,2,3})"
在上下文中运行,就好像 fMyTest
是您创建的查询一样。
如果您需要在 PowerQuery 中对每个工作簿执行相同的操作,但又不想每次更改都编辑每个工作簿,该怎么办?
如果,在您信任其编辑者的安全位置,您有一个文本文件(或其他任何内容,例如数据库工作簿中特殊选项卡中的工作表),其中包含 PowerQuery 代码,在评估时,将导致定义您想要在其他工作簿中使用的每个函数和查询的记录,然后您的每个工作簿都可以有一个名为“DbQueries”的查询,其代码如下
let
DbQueriesText = ... // how you get the text is up to you, here. Maybe getting a table from DB and then doing `Text.Combine(DbQueriesTextTable[Column1], "#(lf)")` to combine all rows separated by a line-feed character.
DbQueries = Expression.Evaluate(DbQueriesText, #shared)
in
DbQueries
然后工作簿中的其他 PowerQuery 代码就可以
DbQueries[DoTheThing]
,而无需接触每个工作簿的推出问题。