如何刷新单个ThisWorkbook.Queries及理清与ThisWorkbook.Connections的关联
Excel中Queries与Connections对象的关联逻辑及刷新方案
核心关联关系
- Queries:存储Power Query的查询定义(M语言公式、查询名称等),属于
ThisWorkbook.Queries集合,是数据获取/转换的逻辑核心。 - Connections:作为Query和工作表数据区域的中间桥梁,属于
ThisWorkbook.Connections集合。默认情况下,Excel会为每个Query自动生成对应的Connection,名称格式为Query - [查询名](比如Query名为"销售数据",对应的Connection名就是"Query - 销售数据"),这就是你遇到名称不一致的原因。
解决代码中的刷新问题
你当前代码里直接用q.Name匹配Connection会失败,因为两者名称规则不同。可以通过以下方式找到Query对应的Connection并刷新:
方案1:按Connection名称前缀匹配
遍历Connections集合,找到名称符合默认生成规则的连接:
Sub EditAllWorkbookFormuals(Order As String) Dim q As Query Dim conn As WorkbookConnection For Each q In ThisWorkbook.Queries ' 更新Query公式 q.Formula = NewQuery(q.Formula, Order) ' 查找对应Connection并刷新 For Each conn In ThisWorkbook.Connections ' 匹配默认生成的Connection名称格式 If conn.Name = "Query - " & q.Name Then conn.Refresh Exit For End If Next conn Next q End Sub
方案2:通过Connection的OLEDBConnection属性关联
每个基于Query的Connection,其OLEDBConnection.CommandText会包含Query的唯一标识,可通过该标识匹配:
Sub EditAllWorkbookFormuals(Order As String) Dim q As Query Dim conn As WorkbookConnection For Each q In ThisWorkbook.Queries q.Formula = NewQuery(q.Formula, Order) For Each conn In ThisWorkbook.Connections If conn.Type = xlConnectionTypeOLEDB Then ' 检查CommandText是否包含当前Query的ID If InStr(conn.OLEDBConnection.CommandText, q.ID) > 0 Then conn.Refresh Exit For End If End If Next conn Next q End Sub
补充说明
- 若无需精准匹配单个Connection,直接调用
ThisWorkbook.RefreshAll即可一次性刷新所有Queries和Connections,代码更简洁。 - 不要直接调用
q.Refresh,因为Query仅负责存储查询逻辑,数据刷新到工作表必须通过对应的Connection完成。
内容的提问来源于stack exchange,提问作者Svein Arne Hylland
相关产品推荐
相关产品推荐

