如何让Power Query刷新后直接为VBA ListBox填充新数据?
解决用户窗体ListBox刷新后显示旧数据的问题
问题核心是ThisWorkbook.RefreshAll默认异步执行——代码会跳过刷新步骤直接往下走,等填充ListBox时,PowerQuery的新数据还没导入到表格里,所以读到的还是旧数据。第二次运行时,前一次的刷新已经完成,自然能加载新数据。
解决步骤:
- 将连接设置为同步刷新,强制代码等待刷新完成后再执行后续操作
- 清空ListBox缓存
- 重新从更新后的表格加载数据
完整代码示例:
Private Sub RefreshInventoryList() ' 遍历所有连接,设置为同步刷新(禁止后台查询) Dim conn As WorkbookConnection For Each conn In ThisWorkbook.Connections If conn.Type = xlConnectionTypeOLEDB Then conn.OLEDBConnection.BackgroundQuery = False End If Next conn ' 执行全量刷新 ThisWorkbook.RefreshAll ' 清空ListBox的旧数据 Me.ListBox1.Clear ' 从更新后的表格加载新数据(假设数据存于Sheet1的"InventoryTable"表中) With Sheet1.ListObjects("InventoryTable") If Not .DataBodyRange Is Nothing Then Me.ListBox1.List = .DataBodyRange.Value Else MsgBox "库存表暂无数据" End If End With End Sub
可选优化(针对单一PowerQuery连接):
如果只有PowerQuery的连接需要刷新,可以精准定位,避免遍历所有连接:
Private Sub RefreshPQAndListBox() Dim pqConn As WorkbookConnection ' 找到PowerQuery对应的连接 For Each pqConn In ThisWorkbook.Connections If InStr(pqConn.OLEDBConnection.Connection, "Power Query") > 0 Then pqConn.OLEDBConnection.BackgroundQuery = False pqConn.Refresh ' 单独刷新该连接 Exit For End If Next pqConn ' 刷新ListBox Me.ListBox1.Clear With Sheet1.ListObjects("InventoryTable") If Not .DataBodyRange Is Nothing Then Me.ListBox1.List = .DataBodyRange.Value End If End With End Sub
注意事项:
- 如果你的ListBox之前用
RowSource绑定数据,记得先将RowSource设为空,避免缓存旧数据:Me.ListBox1.RowSource = "" - 确保表格名称和Sheet名称与实际一致,避免报错
内容的提问来源于stack exchange,提问作者Azfar
相关产品推荐
相关产品推荐

