如何检查连接刷新是否成功
在Excel 2016 VBA中,我正在刷新如下几个查询:
MyWorkbook.Connections(MyConnectionName).Refresh
代码完成后,没有遇到任何错误,我看到大多数查询的沙漏图标仍然旋转几秒钟。
所有刷新完成后是否可以检查成功? 我担心我的代码不会知道代码完成后,但在查询完成刷新之前是否发生错误。
顺便说一句,我不想做一个RefreshAll,因为一些查询是依赖于其他(使用它们作为来源)。 我按照一定的顺序刷新它们,以便依赖查询在它们依赖的查询之后被刷新。
更新:
我看到Connection对象有一个只读的RefreshDate属性,乍一看看它可以用来做这个检查:
MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate
但是,似乎没有被设置。 我收到一个错误,试图检查它。 如果我将Variantvariables设置为RefreshDate属性,则该variables显示为“Empty”。 源是一个SQL服务器数据库。
QueryTable
对象公开两个事件: BeforeRefresh
和AfterRefresh
。
您需要将您的范例从程序/命令改为事件驱动。
假设你在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
variables包含一个QueryTable
对象数组,按您希望刷新的顺序sorting; currentIndex
variables指向该数组中的索引,用于您要对其执行操作的QueryTable
。
所以当Test
运行时,我们用我们要刷新的QueryTable
对象来初始化tables
数组, 按照我们要刷新它们的顺序 。
当table.Refresh
并且QueryTable
触发它的AfterRefresh
事件时,隐式事件驱动循环开始:然后我们报告成功,并用数组中的下一个QueryTable
更新事件提供者table
对象引用(只有刷新成功),并调用它的Refresh
方法,这将再次触发AfterRefresh
,直到整个数组已被遍历或其中一个失败更新。