从PowerQuery

时间:2017-09-06 07:31:24

标签: excel vba powerpivot powerquery

我有一个工作簿,其中有几个PowerQuery查询到其他工作簿。

每年每年都会更新此工作簿 - 这意味着查询需要每年指向新的工作簿。这当然可以手动完成,但是有很多查询,普通用户不知道如何(以及大部分PowerQuery功能都是故意隐藏的)。

所以我编写了一些代码以允许用户选择要指向的新工作簿,然后此代码使用新的源工作簿更新PQ公式。一切正常。

问题是,我需要确保用户选择了有效的工作簿,以便查询仍然有效。我的计划是简单地使用新的工作簿名称更新公式,然后运行Refresh,并捕获任何错误(如果刷新工作正常,那么我的假设是选择的工作簿是有效的。)

但这是问题所在。当我在VBA中使用.Refresh方法时,不会报告错误。有一个用户对话框报告错误,但VBA没有捕获任何内容 - 代码继续运行,好像一切正​​常,并且没有引发错误编号。

而且,对话框不会对Application.DisplayAlerts = False做出反应。它仍然显示,然后VBA代码继续,好像什么也没发生。

所以有人知道我是否有任何方法可以捕获此错误?仅供参考我用于重新打包的代码如下(简化):

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

谢谢!

1 个答案:

答案 0 :(得分:0)

两个选项:

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

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

  3. 我过去使用过#1。我刚发现#2并尝试过它。它适用于我,但它不会阻止PQ错误消息。