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

Gre*_*ern 1 excel vba excel-vba powerquery

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

MyWorkbook.Connections(MyConnectionName).Refresh
Run Code Online (Sandbox Code Playgroud)

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

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

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

更新:

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

MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate
Run Code Online (Sandbox Code Playgroud)

但是,它似乎没有得到设定.我试图检查它时出错.如果我将Variant变量设置为该RefreshDate属性,则该变量显示为"Empty".源是SQL Server数据库.

Mat*_*don 7

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
Run Code Online (Sandbox Code Playgroud)

tables变量包含数组QueryTable对象,你要刷新的顺序排列; currentIndex对于QueryTable您想要操作的变量,变量指向该数组中的索引.

因此,在Test运行时,我们按照要刷新的顺序初始化tables包含QueryTable要刷新的对象的数组.

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