Страницы: 1
RSS
VBA. Ошибка при подключении второй сводной таблицы к срезу, Ошибка при подключении нескольких PivotTable к срезу
 
Добрый день!
Задача такая: Нужно создать несколько сводных таблиц на новом листе по одному источнику, и подключить к этим сводам срезы.

Я всё сделал, всё работает, но возникла проблема решение которой не нашёл нигде. Когда я пытаюсь подключить таблицы к срезу, VBA даёт ошибку (в примере это последняя строчка кода), как будто бы срез не видит вторую таблицу, либо же воспринимает её как из другого источника. Что делать не знаю. Кто-нибудь сталкивался с подобным? Как можно через VBA к нескольким сводным таблицам подключить срезы?

Ошибка вот здесь:
Код
ActiveWorkbook.SlicerCaches("Срез_Влияние").PivotTables.AddPivotTable (ActiveSheet.PivotTables("Приоритет"))

Ну и сам код сразу, в примере во вложении он же

Код
Sub CreatePivotTable()
strCount = Cells(Rows.Count, 1).End(xlUp).Row

'****************************************************************
'Создаём сводную таблицу 1
'****************************************************************

    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="Лист1!A1:H" & strCount, Version:=6).CreatePivotTable TableDestination:="", TableName:="Тип"
        With ActiveSheet
        .Name = "Свод"
        .PivotTableWizard TableDestination:=ActiveSheet.Cells(8, 1)
        End With
        
        With ActiveSheet.PivotTables("Тип")
        
'Отменяем автоматическое изменение ширины сводной таблицы
        .HasAutoFormat = False
        .SmallGrid = True
                
        .PivotFields("Номер").Orientation = xlDataField
        .PivotFields("Номер").Orientation = xlDataField
        
        .PivotFields("Кол-во").Orientation = xlDataField
        .PivotFields("Кол-во").Orientation = xlDataField
        
        .PivotFields("Доля").Orientation = xlDataField
        .PivotFields("Доля").Orientation = xlDataField
        
        .PivotFields("Тип").Orientation = xlRowField
        
'Переименовываем шапки сводной
        .CompactLayoutRowHeader = "Тип"
        .DataPivotField.PivotItems("Количество по полю Номер").Caption = "Кол-во номеров"
        .DataPivotField.PivotItems("Сумма по полю Кол-во").Caption = "Кол-во заявок"
        .DataPivotField.PivotItems("Сумма по полю Доля").Caption = "Показатель "

        .DataPivotField.PivotItems("Количество по полю Номер2").Caption = "Доля номеров "
        .DataPivotField.PivotItems("Сумма по полю Кол-во2").Caption = "Доля заявок "
        .DataPivotField.PivotItems("Сумма по полю Доля2").Caption = "Доля показателя "

'Делаем вычисления по общему проценту от суммы столбца
        .PivotFields("Доля номеров ").Calculation = xlPercentOfTotal
        .PivotFields("Доля заявок ").Calculation = xlPercentOfTotal
        .PivotFields("Доля показателя ").Calculation = xlPercentOfTotal

'Сортируем по убыванию по всем строкам
        .PivotFields("Тип").AutoSort xlDescending, "Доля показателя ", ActiveSheet.PivotTables("Тип").PivotColumnAxis.PivotLines(6), 1
        End With
        
 Sheets("Лист1").Activate
 
'****************************************************************
'Создаём сводную таблицу 2
'****************************************************************

        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="Лист1!A1:H" & strCount, Version:=6).CreatePivotTable TableDestination:="Свод!R14C1", TableName:="Приоритет"
Sheets("Свод").Select
        With ActiveSheet.PivotTables("Приоритет")
        
'Отменяем автоматическое изменение ширины сводной таблицы
        .HasAutoFormat = False
        
        .SmallGrid = True
                
        .PivotFields("Номер").Orientation = xlDataField
        .PivotFields("Номер").Orientation = xlDataField
        
        .PivotFields("Кол-во").Orientation = xlDataField
        .PivotFields("Кол-во").Orientation = xlDataField
        
        .PivotFields("Доля").Orientation = xlDataField
        .PivotFields("Доля").Orientation = xlDataField
        
        .PivotFields("Приоритет").Orientation = xlRowField
        
'Переименовываем шапки сводной
        .CompactLayoutRowHeader = "Приоритет"
        .DataPivotField.PivotItems("Количество по полю Номер").Caption = "Кол-во номеров"
        .DataPivotField.PivotItems("Сумма по полю Кол-во").Caption = "Кол-во заявок"
        .DataPivotField.PivotItems("Сумма по полю Доля").Caption = "Показатель "

        .DataPivotField.PivotItems("Количество по полю Номер2").Caption = "Доля номеров "
        .DataPivotField.PivotItems("Сумма по полю Кол-во2").Caption = "Доля заявок "
        .DataPivotField.PivotItems("Сумма по полю Доля2").Caption = "Доля показателя "

'Делаем вычисления по общему проценту от суммы столбца
        .PivotFields("Доля номеров ").Calculation = xlPercentOfTotal
        .PivotFields("Доля заявок ").Calculation = xlPercentOfTotal
        .PivotFields("Доля показателя ").Calculation = xlPercentOfTotal

'Сортируем по убыванию по всем строкам
        .PivotFields("Тип").AutoSort xlDescending, "Доля показателя ", ActiveSheet.PivotTables("Приоритет").PivotColumnAxis.PivotLines(6), 1
        End With

'****************************************************************
'Делаем срезы
'****************************************************************
    'Первая цифра - положение по оси Y
    'Вторая цифра - положение по оси X
    'Третья цифра - ширина среза
    'Четвёртая цифра - высота среза
'****************************************************************

    ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.PivotTables("Тип"), "Влияние").Slicers.Add ActiveSheet, , "Влияние 1", "Влияние", 0, 0, 150, 80

'Добавляем колонки в срез
    ActiveWorkbook.SlicerCaches("Срез_Влияние").Slicers("Влияние 1").NumberOfColumns = 2

'Подключаем срез к таблице "Приоритет"
'****************************************
'ВОТ ЗДЕСЬ ОШИБКА
'****************************************
    ActiveWorkbook.SlicerCaches("Срез_Влияние").PivotTables.AddPivotTable (ActiveSheet.PivotTables("Приоритет"))


End Sub

 
Доброе время суток
Цитата
antontanachev написал:
либо же воспринимает её как из другого источника
Именно так и происходит. Ваши сводные имеют разный PivotCache, поэтому и нет возможности добавить в срез вторую сводную. Можно в этом убедится без кода, просто посмотрите на листе в срезе ПКМ/Подключение к отчётам - какие сводные доступны для подключения.
Делайте вторую сводную на уже существующем PivotCache и проблем не будет.
 
Андрей, спасибо! Даже не подумал про кэш)

Тем, кто ищет решение - надо при создании ещё одной сводной заменить вот этот код:
Код
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="Лист1!A1:H" & strCount, Version:=6).CreatePivotTable TableDestination:="Свод!R14C1", TableName:="Приоритет"
на этот (убрать create, и у pivotcashes в скобках указать номер кэша (у меня 2 кэша было, поэтому цифра 2, а так один ставить надо)):
Код
ActiveWorkbook.PivotCaches(2).CreatePivotTable TableDestination:="Свод!R14C1", TableName:="Приоритет"
Изменено: antontanachev - 06.06.2019 11:55:16
Страницы: 1
Наверх