Перечислите объекты WorkbookQuery в Excel WorkSHEET - PullRequest
0 голосов
/ 21 сентября 2019

Хотя я знаю, как перечислять (в коде VBA) объекты 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 в списке запросов (при условии, что у пользователя это открыто).

1 Ответ

1 голос
/ 23 сентября 2019

Для каждого запроса, отображаемого на листе, существует автоматически созданное имя в области рабочей книги, которое ссылается на объект ListObject, который отображает результат запроса (просмотрите их в диспетчере имен).Эти ListObject имеют свойство WorkbookConnection, имя которого связано с именем Query.

Если у вас есть запрос с именем скажем MyQuery (отображается налист) будет ListObject с именем WorkbookConnection Query - MyQuery.

Если вы посмотрите на диалоговое окно «Существующие соединения» в Excel, то соединения будут перечислены с префиксом «Запрос», но если вы редактируете соединение, свойство name будет доступно для редактирования без этот префикс.При совершении изменения имени префикс добавляется автоматически.Редактирование имени запроса обновляет имя 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 НЕ обновляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...