Excel/Vba/ADODB: как подключиться к таблице (ListObject) только по ее имени, чтобы выполнить запрос?

Я пытался найти решение своей проблемы, просматривая также предыдущие вопросы, о которых здесь сообщалось, но не нашел решения.

Проблема: как в VBA указать имя таблицы Excel внутри запроса ADODB, если я знаю только имя таблицы (а не ее диапазон адресов)?

Мне нужно запросить некоторые данные данной именованной таблицы («Table_1A»), хранящиеся на данном листе (с именем «1A») другой закрытой книги, сохраненной в каталоге/папке данных ресурсов на моем компьютере.

Похоже, что ADODB не может получить соединение с указанной таблицей (кажется, Таблицы невидимы для ADODB).

Примечание. Классическая таблица «сделанного вручную» (ListObject), в которой первый столбец содержит набор материалов, а остальные столбцы содержат физические свойства материала в зависимости от температуры (значение температуры определяет имя столбца). Никакая сводная таблица или другая таблица не создавала базы данных запросов.

Подключение к таблице возможно только в том случае, если я укажу имя листа плюс диапазон адресов таблицы. Если я укажу только имя Таблицы... ее не существует!

Проблема в том, что диапазон адресов запрашиваемой таблицы может меняться со временем (имя листа, на котором хранится и обновляется таблица, не меняется со временем).

Заранее спасибо за помощь.

Анна

Таблица (ListObject) содержит именованный диапазон .

GSerg 14.07.2024 10:49

Если я правильно понял, мне нужно добавить в ИСТОЧНУЮ книгу, где есть запрошенная таблица, «Именованный диапазон» с тем же адресом диапазона. Таблицы. То есть: если таблица (ListObject) с именем «Table_1A» имеет диапазон A8:BA266, мне нужно создать именованный диапазон (т. е. «Table_1A_Range»), составленный следующим образом: '1A'!$A$8:$BA$266. Правильный?

Ganfoss 14.07.2024 12:31

В таблице уже есть именованный диапазон.

GSerg 14.07.2024 13:18

@Gserg: Похоже, что предопределенный именованный диапазон, связанный с объектом списка, работает неправильно при использовании в строке SQL для ADODB. По крайней мере, мне не удалось заставить его работать. Однако когда я вручную определяю имя для этой таблицы на уровне книги, все работает правильно.

Storax 14.07.2024 16:06

Подтвержденный. В ALODB я вручную определил имя таблицы. @Gserg: используете ли вы другого поставщика или другую процедуру для непосредственной работы с таблицами (ListObjects)?

Ganfoss 14.07.2024 17:45

@Ganfoss Нет. Я думал, что это сработает.

GSerg 14.07.2024 17:54

Можно ли прикрепить файл excel? В качестве доказательств и испытаний?

Ganfoss 14.07.2024 17:56

Вы можете проверить мой комментарий выше, перейдя по этой ссылке Предоставленная там функция не возвращает предопределенный именованный диапазон ListObject. Другой способ решить проблему ОП — использовать PowerQuery.

Storax 14.07.2024 19:25

@Ganfoss, ты проверил мой ответ ниже?

Haluk 17.07.2024 11:29
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
9
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я написал ответ об этом несколько часов назад, но мне пришлось его удалить после того, как GSerg заметил мою ошибку из-за недосыпа, наверное. Спасибо за предупреждения GSerg...

Теперь я подготовил еще один вариант;

  • Закрытая книга с именем «Employee.xlsx» имеет «ListObject» с именем «Table1» на листе «Sheet1». (Обратите внимание, что «Table1» не является определенным именем.)

  • Книга с именем «Book1.xlsm» содержит приведенный ниже макрос, который: преобразует закрытую книгу ("Employee.xlsx") в zip-файл, извлекает содержимое zip-файла во временную папку (с именем "zipFolder") и получает адрес диапазона данных ListObject ("Table1") из связанный XML-файл ".....\xl\tables\Table1.xml"

  • Используя этот адрес диапазона, данные закрытой книги выгружаются на активный лист, начиная с ячейки A2, с помощью ADO.

Этот подход может быть не совсем аккуратным, но если кто-то хочет работать с именем «ListObject», а не с определенным именем, это может быть альтернативой.

Обе книги должны находиться в одной папке...

Итак, код;

Option Explicit
'
Sub Test()
    Dim ListObjectName As String, objShell As Object, zipFile As Variant, myFile As String, zipFolder As Variant
    Dim xDoc As Object, myNode As Object, DataRange As String, adoCN As Object, RS As Object, strSQL As String
    
    ListObjectName = "Table1"
    
    zipFolder = ThisWorkbook.Path & Application.PathSeparator & "zipFolder"
    
    If Dir(zipFolder, vbDirectory) = "" Then
        MkDir ThisWorkbook.Path & "\zipFolder"
    End If
    
    myFile = ThisWorkbook.Path & "\Employee.xlsx"

    zipFile = ThisWorkbook.Path & "\zipFolder\Employee.zip"
    
    Name myFile As zipFile
    
    Set objShell = CreateObject("Shell.Application")
    objShell.Namespace(zipFolder).CopyHere objShell.Namespace(zipFile).items
    
    Name zipFile As myFile
    
    Set xDoc = CreateObject("MSXML2.DOMDocument")
    xDoc.async = False
    xDoc.validateOnParse = False
    
    xDoc.Load zipFolder & "\xl\tables\" & ListObjectName & ".xml"
    
    Set myNode = xDoc.SelectSingleNode("//table")
    DataRange = myNode.Attributes.getNamedItem("ref").Text
    
    Range("A2:C" & Rows.Count) = Empty
    
    Set adoCN = CreateObject("ADODB.Connection")
    Set RS = CreateObject("ADODB.Recordset")
    
    adoCN.Provider = "Microsoft.ACE.OLEDB.12.0"
    adoCN.Properties("Data Source") = myFile
    adoCN.Properties("Extended Properties") = "Excel 12.0 Macro; HDR=Yes; IMEX=1"
    adoCN.Open
        
    strSQL = "Select * From [Sheet1$" & DataRange & "]"
    
    RS.Open strSQL, adoCN
    
    Range("A2").CopyFromRecordset RS
    
    CreateObject("Scripting.FileSystemObject").DeleteFolder zipFolder
        
    RS.Close
    adoCN.Close
    
    Set RS = Nothing
    Set adoCN = Nothing
    Set adoCN = Nothing
    Set xDoc = Nothing
    Set objShell = Nothing
End Sub

Другие вопросы по теме

Похожие вопросы

Заменить генерирует «Ошибка времени выполнения 13: несоответствие типов», когда диапазон содержит более 1 ячейки
Нужна формула, которая поможет перепроверить значения и условия в разных столбцах
Excel – объединить все экземпляры текста перед разделителем в одну ячейку
Запишите изображения в файл Excel — Selenium/Pandas/Python
Подсчет количества ячеек, заполненных данными на основе указанных дат в будущем
Запись в ячейку файла XLSX с помощью скрипта Sheets
Напишите цикл, который будет проверять все вкладки, количество листов, изменение цвета вкладок на основе значений трех ячеек
Как найти результат в соседней ячейке, если в ней используются буквы, форматирование и цифры?
Копирование ячеек без определенного текста в макросе Excel
Суммируйте все ячейки, для которых соответствующая ячейка не является формулой и не возвращает #ЗНАЧЕНИЕ И дата произошла в прошлом