如何让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
相关产品推荐
相关产品推荐

