2017-04-21 57 views
0

在Excel 2016 VBA,我爽快几个查询是这样的:如何检查刷新连接是否成功

MyWorkbook.Connections(MyConnectionName).Refresh 

代码后完成,并没有遇到任何错误,我看到沙漏图标因为大部分查询仍在旋转几秒钟。

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

顺便说一句我不想做一个RefreshAll,因为一些查询依赖于其他人(使用它们作为源)。我按照一定的顺序刷新它们,以便依赖查询在它们依赖的查询后刷新。

UPDATE:

我看到,连接对象有一个只读RefreshDate特性,乍一看看起来像它可以用来做此项检查:

MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate 

但是,它不似乎没有成立。试图检查它时出现错误。如果我为该RefreshDate属性设置了Variant变量,则该变量显示为“Empty”。源是一个SQL服务器数据库。

回答

4

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事件:那么我们报告成功,并在阵列中更新下一个QueryTable事件提供table对象引用(仅在刷新已成功),并调用其Refresh方法,该方法将再次激发AfterRefresh,直到遍历整个数组或其中一个未能更新。

+1

谢谢,这很好。我有一个查询只是连接,所以我不得不将它加载到一个表,以便它有一个ListObject,因此一个查询表。这增加了一点点的文件大小,但这是一个很小的代价来付诸实施。 –