如何使用 Power Query 将另一个工作簿中的每个表连接到 xlsx 工作簿?

问题描述 投票:0回答:1

所以,我有很多类似的工作簿,它们连接到一种特殊的数据库工作簿。每次,当我在数据库工作簿中添加包含新表的工作表时,我需要在所有工作簿(连接到数据库)中向该表添加新的 Power Query 连接。

如图所示,我必须手动设置与每个表的连接。 有没有办法动态获取数据库工作簿中的所有表,但不使用 VBA 宏?

excel powerquery xlsx xls
1个回答
0
投票

您问是否有一种方法无需 VBA 即可获取所有表。

是的。

Excel.Workbook(File.Contents(DbFilePath), null, true)
返回包含以下列的表格:

  • Name是对象的名称
  • Data 是包含对象内容的表
  • Item是我还没有使用过的文本列。
  • Kind 是工作簿中对象的类型,例如“工作表”、“表格”、“定义名称”
  • Hidden 是一个逻辑值,显示对象是否隐藏。

这意味着您可以使用类似代码进行名为“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]
,而无需接触每个工作簿的推出问题。

© www.soinside.com 2019 - 2024. All rights reserved.