【问题标题】:Unable to capture errors in VBA when refreshing a query from PowerQuery从 PowerQuery 刷新查询时无法捕获 VBA 中的错误
【发布时间】: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


【解决方案1】:

两种选择:

  1. 检查 Power Query M 代码中的错误。如果检测到错误,则输出不同的数据表,可能是仅包含错误代码的 1x1 表。发生此错误时,PQ 刷新成功完成(就 PQ 而言),用户没有收到错误消息,您的 VBA 代码可以检查 PQ 是否生成了错误表。

  2. 为 QueryTable 使用 AfterRefresh 事件,如下所述: How to check whether Connection Refresh was successful

我过去使用过#1。我刚刚发现了 #2 并尝试了它。它对我有用,但不能阻止 PQ 错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多