【发布时间】:2017-09-06 07:31:23
【问题描述】:
我有一个工作簿,其中包含对其他工作簿的多个 PowerQuery 查询。
此工作簿每年在每个财政年度更新 - 这意味着查询需要每年指向新的工作簿。这当然可以手动完成,但是有很多查询并且普通用户不知道如何操作(而且,PowerQuery 的大部分功能是故意对用户隐藏的)。
所以我编写了一些代码让用户选择要指向的新工作簿,然后这段代码使用新的源工作簿更新 PQ 公式。这一切都很好。
问题是,我需要确保用户选择了有效的工作簿,以便查询仍然有效。我的计划是用新的工作簿名称简单地更新公式,然后运行刷新,并捕获任何错误(如果刷新工作正常,那么我假设所选的工作簿是有效的)。
但这就是问题所在。我在 VBA 中使用 .Refresh 方法时,没有报错。有一个用户对话框报告错误,但 VBA 没有捕获任何内容 - 代码继续运行,就好像一切正常,并且没有引发错误号。
此外,对话框不会对 Application.DisplayAlerts = False 做出反应。它仍然显示,然后 VBA 代码继续执行,就好像什么都没发生一样。
那么有谁知道我是否有任何方法可以捕获此错误?仅供参考,我用于 reresh 的代码如下(简化):
Application.DisplayAlerts = False ' This does not stop the user dialog!
Dim conn as WorkbookConnection
Set conn = ThisWorkbook.Connections("MyQueryName")
conn.Refresh 'No error raised here, even if the Refresh fails
(there is however a user error dialog)
(注意,如果我使用 conn.OLEDBConnection.Refresh,问题是一样的)
仅供参考,根据 MS 文档,我应该能够停止对话框,但它对我不起作用(请参阅 https://msdn.microsoft.com/VBA/Excel-VBA/articles/workbookconnection-refresh-method-excel)
谢谢!
【问题讨论】:
-
只要检查它是否是一个有效的工作簿。这里有很多关于这方面的信息。例如,您甚至可以打开工作表并检查它是否有正确的列。
-
@Luuklag - 完全理解这是可能的(这实际上是我正在使用的解决方法),但如果我能用 .Refresh 方法找到答案,代码将更容易维护,因为我不会如果添加任何新查询,则不需要更新它,这很可能发生。
-
这种错误信息可能有事件处理器?
-
出现的对话框中的错误信息是什么?这将是 Power Query 中的一个错误。
-
对话框中的错误示例是: [Expression.Error] 键与表中的任何行都不匹配。但错误是正确的 - 如果新选择的工作簿不包含正确的数据结构/表,那么它当然会出错。但我无法捕获 VBA 中的错误,这就是问题所在。
标签: excel vba powerpivot powerquery