PowerQuery:在数据源文件打开时刷新表查询

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

我有一个 Excel 工作簿,其中包含一个通过 PowerQuery 链接到多个数据源文件的表。用户很可能会在数据源文件中更新它们。当数据源文件由另一个用户打开时,我是否可以使用 powerquery 刷新我的表。我不断收到消息:

[DataSource.Error] 该进程无法访问文件“......”,因为它正在被另一个进程使用。

excel powerquery vba
3个回答
2
投票

过滤掉名称以“~”开头的文件。


0
投票

我在尝试弄清楚如何做同样的事情时发现了这个主题。 以防万一将来有人发现这个,我会提到我如何应用 MarcelBeug 的解决方案。

代码是这样的

let Source = Folder.Files("MyFilePathHere\"),
#"Added Custom" = Table.AddColumn(Source, "Custom", each 
Excel.Workbook([Content],true)),

更改为

let Source = Folder.Files("MyFilePathHere\"),
#"Filtered Rows1" = Table.SelectRows(Source, each not Text.StartsWith([Name], "~$")),
#"Added Custom" = Table.AddColumn(#"Filtered Rows1", "Custom", each 
Excel.Workbook([Content],true)),

我通过 GUI 编辑器对文件名使用文本过滤器进行了更改。 过滤器为“不开头”,值为“~$”。


0
投票

经过大量的试验和错误以及大量的恩典,我找到了以下解决方法,无论 OneDrive 同步状态如何,该方法都确实有效。

情况说明: 当 OneDrive for Desktop 同步 Excel 工作簿(我们称之为数据工作簿),并且该工作簿尝试通过 PowerQuery 甚至直接通过常规数据透视表(甚至不是 PowerPivot)从另一个工作簿(我们称之为分析工作簿)访问时 - Excel 会定期抛出错误“进程无法访问该文件,因为该文件正在被另一个进程使用”。发生这种情况是因为导入/读取机制需要对数据工作簿进行独占访问(即使它只是读取它)。你对此无能为力。

解决方法: 您必须“欺骗”导入机制,使其认为它没有访问另一个工作簿。有一个足够好的解决方案,可以在大多数情况下应用和自动化:

  1. 在 Analysis Workbook 中设置一个简单的单一公式, 来自数据工作簿的所有相关数据,然后
  2. 建立导入机制以将其用作来源。

这成功规避了 OneDrive 的所有问题。 有关在分析工作簿中使用常规数据透视表作为数据使用者的示例的详细信息:

  1. 假设您的数据工作簿是 My Data.xlsx,该数据工作簿中的 Excel 表是您的数据源,该表名为 source_data。为了简单起见,我假设所有工作簿都在同一个文件夹中。
  2. 在分析工作簿中,添加工作表“ds_trick”,并在A1单元格中放置公式 ='我的数据.xlsx'!source_data[#All] (无论源数据表有多大,它都会适合此工作表,因为公式位于 A1 中,并且数据工作簿工作表中的行数不能多于分析工作簿工作表中的行数,因此您在这一侧是安全的)
  3. 假设该数据表填充了从 A 到 N 的列。将数据透视表数据源更改为“ds_trick”!$A:$N。请注意,您没有指定此引用中的行 - 您引用的是整列!
  4. 确保您创建的任何自动化机制在订购数据透视缓存刷新之前打开数据工作簿。

备注:

  • 数据透视表不支持命名范围作为源,因此您无法直接引用其中数据工作簿的 Excel 表。如果您尝试在分析工作簿中创建引用数据工作簿中的表的命名范围,它也将不起作用。您必须通过分析工作簿中的公式提取数据。
  • 如果没有命名范围作为数据透视表的数据源,您将留下“固定”行数来定义哪些行不好,因此解决这个问题的技巧是引用整个列 - 幸运的是数据透视表可以很好地修剪空行,所以这实际上处理输入数据时没有任何延迟。这样,您就可以成功地将动态命名范围伪造为数据透视表的源(以行为单位)
© www.soinside.com 2019 - 2024. All rights reserved.