excel - 枚举 Excel 工作表中的 WorkbookQuery 对象
问题描述
虽然我知道如何(在 VBA 代码中)枚举整个 Workbook 中的 WorkbookQuery 对象,但我只需要知道如何为一张工作表这样做。这是适用于整个工作簿的代码...
Option Explicit
Public Sub EnumerateWorkbookQueries()
Dim q As WorkbookQuery
For Each q In ThisWorkbook.Queries
Debug.Print q.Name
Next q
End Sub
我知道 WorkbookQuery 对象(顾名思义)收集在工作簿中,但它们返回的数据进入特定工作表上的表中。当您单击其中一个表时,Excel 知道在查询列表中突出显示其关联的 WorkbookQuery 对象(假设用户已打开该对象)。
解决方案
对于工作表上显示的每个查询,都有一个自动创建的工作簿范围名称,它引用一个 ListObject,显示查询结果(在名称管理器中查看它们)。这些ListObject
有一个WorkbookConnection
属性,其名称与名称相关Query
。
如果您有一个名为 say 的查询MyQuery
(显示在工作表上),则会有一个 ListObject ,其 WorkbookConnection 名为Query - MyQuery
。
如果您查看 Excel 中的“现有连接”对话框,则会使用“查询 -”前缀列出连接,但如果您编辑连接,则可以在没有该前缀的情况下编辑名称属性。在提交名称更改时,会自动重新添加前缀。编辑 Query 的名称会更新 WorkbookConnection 名称,反之亦然。
您可以关闭它以检查任何给定工作表上的查询
Public Sub EnumerateWorksheetQueries(ws As Worksheet)
Dim lo As ListObject
Dim qt As QueryTable
If ws.ListObjects.Count > 0 Then
For Each lo In ws.ListObjects
Set qt = Nothing
On Error Resume Next
Set qt = lo.QueryTable
On Error GoTo 0
If Not qt Is Nothing Then
Debug.Print ws.Parent.Queries(Mid$(lo.QueryTable.WorkbookConnection.Name, 9)).Name
End If
Next
End If
End Sub
像这样称呼它
Sub Demo1
EnumerateWorksheetQueries ActiveSheet
End Sub
或者
Sub Demo2()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Debug.Print "Queries on " & ws.Name
EnumerateWorksheetQueries ws
Next
End Sub
注意:一个问题,ListObject 的默认名称也与查询相关,但可以由用户更改。更改 ListObject 名称时,Query 和 WorkbookConnection 的名称不会更新。
推荐阅读
- machine-learning - 不平衡的数据集不会产生良好的“精确度”或“召回率”
- php - 使用键比较 2 个数组并根据 PHP 中的键减去值
- firebase - 离子应用 | Firebase Crashlytics 不适用于崩溃报告?
- javascript - 使用相同的用户名和密码从我的页面登录 one.com 控制面板
- sql-server-2008 - 将带有 varchar 数据的 SQL 列更新为 nvarchar 列数据
- javascript - 在谷歌分析中消除 3 倍的综合浏览量
- c# - 拒绝连接 - Redis 用于 ASP.Net Core 2.1 中的数据保护密钥
- ios - dyld:找不到符号:_OBJC_CLASS_$_GULObjectSwizzler
- python - 请求 Bing Text to Speech API 时出现 401 Unauthorized
- solr - Solr:当我们在 SolrConfig 中有 autoCommit 时,我们是否需要 commit=true 查询?