Я пытался найти решение своей проблемы, просматривая также предыдущие вопросы, о которых здесь сообщалось, но не нашел решения.
Проблема: как в VBA указать имя таблицы Excel внутри запроса ADODB, если я знаю только имя таблицы (а не ее диапазон адресов)?
Мне нужно запросить некоторые данные данной именованной таблицы («Table_1A»), хранящиеся на данном листе (с именем «1A») другой закрытой книги, сохраненной в каталоге/папке данных ресурсов на моем компьютере.
Похоже, что ADODB не может получить соединение с указанной таблицей (кажется, Таблицы невидимы для ADODB).
Примечание. Классическая таблица «сделанного вручную» (ListObject), в которой первый столбец содержит набор материалов, а остальные столбцы содержат физические свойства материала в зависимости от температуры (значение температуры определяет имя столбца). Никакая сводная таблица или другая таблица не создавала базы данных запросов.
Подключение к таблице возможно только в том случае, если я укажу имя листа плюс диапазон адресов таблицы. Если я укажу только имя Таблицы... ее не существует!
Проблема в том, что диапазон адресов запрашиваемой таблицы может меняться со временем (имя листа, на котором хранится и обновляется таблица, не меняется со временем).
Заранее спасибо за помощь.
Анна
Если я правильно понял, мне нужно добавить в ИСТОЧНУЮ книгу, где есть запрошенная таблица, «Именованный диапазон» с тем же адресом диапазона. Таблицы. То есть: если таблица (ListObject) с именем «Table_1A» имеет диапазон A8:BA266, мне нужно создать именованный диапазон (т. е. «Table_1A_Range»), составленный следующим образом: '1A'!$A$8:$BA$266. Правильный?
В таблице уже есть именованный диапазон.
@Gserg: Похоже, что предопределенный именованный диапазон, связанный с объектом списка, работает неправильно при использовании в строке SQL для ADODB. По крайней мере, мне не удалось заставить его работать. Однако когда я вручную определяю имя для этой таблицы на уровне книги, все работает правильно.
Подтвержденный. В ALODB я вручную определил имя таблицы. @Gserg: используете ли вы другого поставщика или другую процедуру для непосредственной работы с таблицами (ListObjects)?
@Ganfoss Нет. Я думал, что это сработает.
Можно ли прикрепить файл excel? В качестве доказательств и испытаний?
Вы можете проверить мой комментарий выше, перейдя по этой ссылке Предоставленная там функция не возвращает предопределенный именованный диапазон ListObject. Другой способ решить проблему ОП — использовать PowerQuery.
@Ganfoss, ты проверил мой ответ ниже?
Я написал ответ об этом несколько часов назад, но мне пришлось его удалить после того, как 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
Таблица (ListObject) содержит именованный диапазон .