Цитата |
---|
БМВ написал: С празником |
Спасибо, Михаил. И вас также с Праздником!
Я бы сделал бы, в отличии от Павлова, подключение, например таким кодом (пусть есть лист "Список" на котором находится "умная" таблица с одним столбцом, в котором введены имена интересующих для сбора листов)
Код |
---|
Public Sub createProcutConnectionConntection()
Const baseConn As String = "ODBC;DBQ=$1;Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DriverId=1046;MaxBufferSize=2048;PageTimeout=5;ReadOnly=1;"
Const baseSQL = "Select '$1' As [Товар], [Фирма], [Название], [Масса] From [$1$]"
Dim sConn As String, sSQL As String, i As Long, arrList As Variant
Dim lCol As ListColumn
sConn = Replace$(baseConn, "$1", ThisWorkbook.FullName)
Set lCol = ThisWorkbook.Worksheets("Список").ListObjects(1).ListColumns(1)
arrList = lCol.DataBodyRange.Value
sSQL = ""
For i = 1 To UBound(arrList, 1)
If sSQL = "" Then
sSQL = Replace$(baseSQL, "$1", arrList(i, 1))
Else
sSQL = sSQL & " Union All " & Replace$(baseSQL, "$1", arrList(i, 1))
End If
Next
ThisWorkbook.Connections.Add _
"Товары_" & Format$(Now, "yyyymmdd_hhnnss"), _
"Подключение для сводной по товарам", _
sConn, _
sSQL, _
xlCmdSql
End Sub |
А уже по этому подключению бы строил сводную. Если состав листов не меняется, а меняются только данные в них, то достаточно только обновить сводную. Если же есть изменения и по составу листов, то
Либо написать макрос, который меняет в существующем запросе текст SQL запроса, плюс, если нужно, то корректирует путь к источнику данных.
Либо всё это самое можно "ручками" подредактировать в определении подключения, как путь так и запрос - обычный текст, тут и начинающий по аналогии разберётся, всё в достаточной мере шаблонно.
Хотя, на мой вкус, такое подключение лучше делать на Power Query, отбирая по шаблону названий столбцов таблиц, получаемых с листов книги, нужные таблицы для объединения. Так и проблему с именем и путём книги можно решить и листы будут собираться автоматически при обновлении. Уже выкладывал такой вариант на форуме.