Страницы: 1
RSS
Создание сводной таблицы по нескольким именованным диапазонам
 
Добрый день, форумчане!

Нашла на полях форума замечательный макрос, который позволяет построить НОРМАЛЬНУЮ сводную таблицу по нескольким диапазонам из разных листов.
Можно ли как-то видоизменить этот макрос, чтобы данные для сводной таблицы брались не из листов, а из именованных диапазонов??

Вот текст макроса:
Код
Sub New_Multi_Table_Pivot()    Dim i As Long
    Dim arSQL() As String
    Dim objPivotCache As PivotCache
    Dim objRS As Object
    Dim ResultSheetName As String
    Dim SheetsNames As Variant
 
    'имя листа, куда будет выводиться результирующая сводная
    ResultSheetName = "Сводная"
    'массив имен листов с исходными таблицами
    SheetsNames = Array("Альфа", "Бета", "Гамма", "Дельта")
 
    'формируем кэш по таблицам с листов из SheetsNames
    With ActiveWorkbook
        ReDim arSQL(1 To (UBound(SheetsNames) + 1))
        For i = LBound(SheetsNames) To UBound(SheetsNames)
            arSQL(i + 1) = "SELECT * FROM [" & SheetsNames(i) & "$]"
        Next i
        Set objRS = CreateObject("ADODB.Recordset")
        objRS.Open Join$(arSQL, " UNION ALL "), _
                   Join$(Array("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=", _
                               .FullName, ";Extended Properties=""Excel 8.0;"""), vbNullString)
    End With
 
    'создаем заново лист для вывода результирующей сводной таблицы
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets(ResultSheetName).Delete
    Set wsPivot = Worksheets.Add
    wsPivot.Name = ResultSheetName
 
    'выводим на этот лист сводную по сформированному кэшу
    Set objPivotCache = ActiveWorkbook.PivotCaches.Add(xlExternal)
    Set objPivotCache.Recordset = objRS
    Set objRS = Nothing
    With wsPivot
        objPivotCache.CreatePivotTable TableDestination:=wsPivot.Range("A3")
        Set objPivotCache = Nothing
        Range("A3").Select
    End With
 
End Sub
Изменено: Lyubov Yakovenko - 12.05.2016 09:52:47
 
Доброе время суток
Без примера файла с именованными диапазонами, только приблизительно
1 в массиве SheetsNames  укажите список имён диапазонов
2 удалите $ в строке  "SELECT * FROM [" & SheetsNames(i) & "$]"
Успехов.
 
Lyubov Yakovenko, код следует оформлять соответствующим тегом: ищите такую кнопку и исправьте своё сообщение.
Спасибо!
 
Цитата
...исправьте своё сообщение

Юрий, исправила. Спасибо.
 
Андрей, спасибо за ответ. Изменила текст макроса, но не работает. Выдает ошибку:  



Прилагаю файл с именованными динамическими диапазонами.
 
Доброе время суток
Цитата
Lyubov Yakovenko написал:
Изменила текст макроса, но не работает
Естественно, у вас нет именованных диапазонов - только имена таблиц, а это не одно и тоже, движок Access с ними не работает даже в 2016. Либо совмещаете именованный диапазон с диапазоном таблицы (ссылку нужно вводить руками) и размер этого диапазона будет автоматически меняться вместе с изменением размера таблицы, либо обращаетесь к именам листов, как в исходной статье, либо используете Power Query для слияния таблиц в один источник данных для сводной как подключение к данным.
Изменено: Андрей VG - 12.05.2016 12:25:56
 
Приношу свои извинения за спешку, не внимательно посмотрел, что у вас там сводные, а в имена ссылаются на формулы, а не на конкретный диапазон. Всё остальное в силе. SQL работает только с именами, которые явно ссылаются на диапазон ячеек.
 
Т.е. я не могу в макросе прописать имена диапазонов, из которых бы собиралась сводная, я правильно понимаю? Нужно искать другое решение.
 
Повторюсь, движок Access работает только с именами, если он ссылаются на диапазон ячеек. В вашем случае только обходной манёвр. Насколько понимаю, вы пытаетесь построить сводную по другим сводным? Почему бы тогда не задействовать Power Pivot?
 
Да, мне нужно построить сводную таблицу из нескольких источников (у меня в кач-ве источников OLAP-кубы, по сути, сводные таблицы), именованный диапазон использую, чтобы при обновлении куба не приходилось менять диапазон для сводной таблицы. Так как я VBA не владею, думала, что в макросе, который собирает данные из разных листов, можно подкорректировать код таким образом, чтобы собиралось из именованных диапазонов. Буду обходить иначе ))). Спасибо за комментарии и помощь. С Power Pivot не знакома, поизучаю, что это и, возможно, если разберусь, применю )))
Страницы: 1
Наверх