首页 > 解决方案 > 枚举 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 对象(假设用户已打开该对象)。

标签: excelvba

解决方案


对于工作表上显示的每个查询,都有一个自动创建的工作簿范围名称,它引用一个 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 的名称不会更新。


推荐阅读