You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让VBA刷新指定ListObject时等待完成再执行后续代码?

问题描述

我有一段可以刷新工作簿所有数据连接的VBA代码,它会等待所有连接刷新完成后再执行宏的剩余部分,运行完全正常:

Sub Refresh_All_Data_Connections()

    For Each objConnection In ThisWorkbook.Connections
        '获取当前后台刷新设置
        bBackground = objConnection.OLEDBConnection.BackgroundQuery
        
        '临时禁用后台刷新
        objConnection.OLEDBConnection.BackgroundQuery = False
        
        '刷新该连接
        objConnection.Refresh
        
        '恢复原后台刷新设置
        objConnection.OLEDBConnection.BackgroundQuery = bBackground
    Next
    
    Call copy_paste_data
    
End Sub

现在我想实现类似逻辑,但不刷新所有数据连接,仅更新指定表格。于是我把代码中的objConnection.Refresh替换为Worksheets("Sheet1").ListObjects("Table1").Refresh,但修改后的代码无法等待该表格刷新完成就继续执行后续宏逻辑,请问该如何解决?

解决方案

直接调用ListObject.Refresh时,会沿用该表格对应连接的后台刷新设置,若原连接开启了后台刷新,代码就不会等待刷新完成。要实现等待逻辑,需找到表格对应的连接,沿用原代码“临时禁用后台刷新”的思路:

Sub Refresh_Specific_Table()
    Dim targetTable As ListObject
    Dim relatedConn As WorkbookConnection
    Dim originalBgSetting As Boolean
    
    '指定目标表格
    Set targetTable = Worksheets("Sheet1").ListObjects("Table1")
    '获取表格关联的工作簿连接
    Set relatedConn = ThisWorkbook.Connections(targetTable.QueryTable.Connection)
    
    '保存连接原有的后台刷新设置
    originalBgSetting = relatedConn.OLEDBConnection.BackgroundQuery
    '临时禁用后台刷新,强制同步等待
    relatedConn.OLEDBConnection.BackgroundQuery = False
    
    '刷新表格
    targetTable.Refresh
    
    '恢复连接的原始后台刷新设置
    relatedConn.OLEDBConnection.BackgroundQuery = originalBgSetting
    
    '刷新完成后执行后续宏
    Call copy_paste_data
End Sub

核心要点

  • 每个基于数据连接的ListObject都绑定了一个WorkbookConnection,通过targetTable.QueryTable.Connection可获取连接名称,进而定位到对应连接对象
  • 将连接的BackgroundQuery设为False,就能让代码等待刷新完成后再执行后续逻辑
  • 必须恢复原始的后台刷新设置,避免影响该连接在其他场景下的使用

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:32:22