如何检查连接刷新是否成功

时间:2017-04-21 17:15:40

标签: excel vba excel-vba powerquery

在Excel 2016 VBA中,我刷新了几个这样的查询:

MyWorkbook.Connections(MyConnectionName).Refresh

代码完成后,没有遇到任何错误,我发现大多数查询的沙漏图标仍在旋转几秒钟。

完成所有刷新后是否可以检查成功?我担心我的代码不会知道代码完成后但在查询完成之前是否发生错误。

BTW我不想做一个RefreshAll,因为有些查询依赖于其他查询(将它们用作源)。我按特定顺序刷新它们,以便在依赖查询之后刷新相关查询。

更新:

我看到Connection对象有一个只读的RefreshDate属性,乍一看看起来可以用来做这个检查:

MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate

然而,它似乎没有被设定。我试图检查它时出错。如果我将Variant变量设置为该RefreshDate属性,则该变量显示为“Empty”。源是SQL服务器数据库。

2 个答案:

答案 0 :(得分:6)

QueryTable对象公开了两个事件:BeforeRefreshAfterRefresh

你需要将范式从程序/命令改为事件驱动。

假设您在ThisWorkbook中有此代码(在标准过程代码模块中不起作用,因为WithEvents只能在类中):

Option Explicit
Private WithEvents table As Excel.QueryTable
Private currentIndex As Long
Private tables As Variant

Private Sub table_AfterRefresh(ByVal Success As Boolean)
    Debug.Print table.WorkbookConnection.Name & " refreshed. (success: " & Success & ")"
    currentIndex = currentIndex + 1
    If Success And currentIndex <= UBound(tables) Then
        Set table = tables(currentIndex)
        table.Refresh
    End If
End Sub

Public Sub Test()
    tables = Array(Sheet1.ListObjects(1).QueryTable, Sheet2.ListObjects(1).QueryTable)
    currentIndex = 0
    Set table = tables(currentIndex)
    table.Refresh
End Sub

tables变量包含QueryTable个对象的数组,按照您希望刷新的顺序排序; currentIndex变量指向该数组中的索引,对于您要对其执行的QueryTable

因此,当Test运行时,我们会使用我们要刷新的tables个对象初始化QueryTable数组,按照我们要刷新它们的顺序

隐式事件驱动的循环在调用table.Refresh并且QueryTable触发其AfterRefresh事件时开始:然后我们报告成功,并更新事件提供者{{1}对象引用与数组中的下一个table(仅当刷新成功时),并调用其QueryTable方法,该方法将再次触发Refresh,直到整个数组被遍历为止或者其中一个未能更新。

答案 1 :(得分:1)

刚刚在Execute code after a data connection is refreshed找到了这个解决方案

最重要的是:Excel在后台刷新数据连接,因此其余代码将不间断地执行。

解决方案:将BackgroundQuery属性设置为False

示例:

For Each cnct In ThisWorkbook.Connections
   cnct.ODBCConnection.BackgroundQuery = False
Next cnct

可能的问题:不知道它是哪个连接...

补救措施:情况...何时...

Dim cnct as WorkbookConnection ' if option explicit
' ODBC and OLE DB
For Each cnct In ThisWorkbook.Connections
   Select case cnct.type
      case xlconnectiontypeodbc
   cnct.ODBCConnection.BackgroundQuery = False
      case xlconnectiontypeoledb
    cnct.OledbConnection.BackgroundQuery = False
   end select
Next cnct

如您所见,以上代码仅处理 ODBC OLE DB 。根据您使用的数据连接类型,可以展开select case子句。除非更改,否则运行后,连接的BackgroundQuery将保持关闭状态。