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

Posted

技术标签:

【中文标题】如何检查连接刷新是不是成功【英文标题】:How to check whether Connection Refresh was successful如何检查连接刷新是否成功 【发布时间】:2017-04-21 17:15:40 【问题描述】:

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

MyWorkbook.Connections(MyConnectionName).Refresh

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

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

顺便说一句,我不想​​执行 RefreshAll,因为某些查询依赖于其他查询(将它们用作源)。我以一定的顺序刷新它们,以便在它们依赖的查询之后刷新依赖的查询。

更新:

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

MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate

但是,它似乎没有设置好。我在尝试检查时遇到错误。如果我将 Variant 变量设置为 RefreshDate 属性,则该变量显示为“空”。源是 SQL Server 数据库。

【问题讨论】:

【参考方案1】:

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 运行时,我们用我们想要刷新的QueryTable 对象初始化tables 数组,按照我们想要刷新它们的顺序

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

【讨论】:

谢谢,效果很好。我有一个只是连接的查询,所以我必须将它加载到一个表中,以便它有一个 ListObject 和一个 Querytable。这增加了一点文件大小,但为此付出的代价很小。【参考方案2】:

刚刚在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

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

【讨论】:

谢谢,但是我已经快两年没有看这段代码了。这是为了一份很久以前就结束的合同。我现在与这个项目的唯一联系是将该经理用作新合同的参考。 :-) 哦,很遗憾听到这个消息......我最近才开始处理这个问题,所以这就是为什么我发现你的帖子很有帮助并想提供一个替代方案。祝你未来的努力好运!

以上是关于如何检查连接刷新是不是成功的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 UI 是不是正在刷新?

如何在 macos 中刷新或清除 *** (L2TP) 设置

在 Flutter WebView 中检查连接并强制刷新

PowerQueryExcel 自动刷新PowerQuery连接

PowerQueryExcel 自动刷新PowerQuery连接

PowerQueryExcel 自动刷新PowerQuery连接