如何检查连接刷新是否成功
How to check whether Connection Refresh was successful
在 Excel 2016 VBA,我正在刷新几个这样的查询:
MyWorkbook.Connections(MyConnectionName).Refresh
代码完成后,没有遇到任何错误,我看到大多数查询的沙漏图标仍在旋转几秒钟。
是否可以在所有刷新完成后检查是否成功?我担心我的代码不会知道在代码完成之后但在查询完成刷新之前是否发生错误。
顺便说一句,我不想执行 RefreshAll,因为某些查询依赖于其他查询(将它们用作源)。我按照一定的顺序刷新它们,这样依赖查询在它们所依赖的查询之后被刷新。
更新:
我看到 Connection 对象有一个只读的 RefreshDate 属性,乍一看似乎可以用来做这个检查:
MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate
但是,它似乎没有设置。我在尝试检查它时遇到错误。如果我将 Variant 变量设置为 RefreshDate 属性,该变量显示为 "Empty"。来源是 SQL 服务器数据库。
QueryTable
对象公开了两个事件:BeforeRefresh
和 AfterRefresh
。
您需要将范式从 procedural/imperative 更改为事件驱动。
假设您在 ThisWorkbook
中有此代码(在标准程序代码模块中不起作用,因为 WithEvents
只能在 class 中):
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
运行时,我们使用要刷新的 QueryTable
个对象初始化 tables
数组,按照我们要刷新它们的顺序.
当调用 table.Refresh
并且 QueryTable
触发其 AfterRefresh
事件时,隐式的事件驱动循环开始:然后我们报告成功,并更新事件提供者 table
对象引用数组中的下一个 QueryTable
(仅当刷新成功时),并调用其 Refresh
方法,该方法将再次触发 AfterRefresh
,直到整个数组被遍历或其中之一更新失败
刚在 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
将保持关闭状态。
在 Excel 2016 VBA,我正在刷新几个这样的查询:
MyWorkbook.Connections(MyConnectionName).Refresh
代码完成后,没有遇到任何错误,我看到大多数查询的沙漏图标仍在旋转几秒钟。
是否可以在所有刷新完成后检查是否成功?我担心我的代码不会知道在代码完成之后但在查询完成刷新之前是否发生错误。
顺便说一句,我不想执行 RefreshAll,因为某些查询依赖于其他查询(将它们用作源)。我按照一定的顺序刷新它们,这样依赖查询在它们所依赖的查询之后被刷新。
更新:
我看到 Connection 对象有一个只读的 RefreshDate 属性,乍一看似乎可以用来做这个检查:
MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate
但是,它似乎没有设置。我在尝试检查它时遇到错误。如果我将 Variant 变量设置为 RefreshDate 属性,该变量显示为 "Empty"。来源是 SQL 服务器数据库。
QueryTable
对象公开了两个事件:BeforeRefresh
和 AfterRefresh
。
您需要将范式从 procedural/imperative 更改为事件驱动。
假设您在 ThisWorkbook
中有此代码(在标准程序代码模块中不起作用,因为 WithEvents
只能在 class 中):
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
运行时,我们使用要刷新的 QueryTable
个对象初始化 tables
数组,按照我们要刷新它们的顺序.
当调用 table.Refresh
并且 QueryTable
触发其 AfterRefresh
事件时,隐式的事件驱动循环开始:然后我们报告成功,并更新事件提供者 table
对象引用数组中的下一个 QueryTable
(仅当刷新成功时),并调用其 Refresh
方法,该方法将再次触发 AfterRefresh
,直到整个数组被遍历或其中之一更新失败
刚在 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
将保持关闭状态。