Не удается подключить слайсер к нескольким сводным таблицам - Ошибка № 424 «Требуется объект» - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь подключить слайсер к нескольким сводным таблицам, используя метод, описанный здесь: http://dailydoseofexcel.com/archives/2014/08/05/slicers-and-slicercaches/

Сначала я перебираю свои сводные таблицы и создаю срез для каждой из них:

wkbDash.SlicerCaches.Add(wksPivots.PivotTables(sPTName), sSlicerName). _
    Slicers.Add wksSlicers, , sSlicerName, sSlicerName, 1, 1, 50, 100

Затем я перебираю свои слайсеры и пытаюсь подключить их к каждой сводной таблице

Проблема: я получаю сообщение об ошибке # 424 «Требуется объект» в этой строке:

wkbDash.SlicerCaches(objSlicer).PivotTables.AddPivotTable 
(wksPivots.PivotTables(varPTNames(i, 1)))

Код для подключения слайсеров к сводным таблицам:

' Declarations
Dim objSlicerCache  As SlicerCache
Dim objSlicer       As Slicer
Dim objPT           As PivotTable
Dim varPTNames      As Variant
Dim wksDefPivots    As Worksheet
Dim wkbDash         As Workbook
Dim i               As Integer

' Initialize Variables
Set wkbDash = Workbooks(sDash)
Set wksDefPivots = Workbooks(sDash).Worksheets(sDefPivots)
varPTNames = wksDefPivots.Range("A2:A" & FindLastRow(wksDefPivots)).Value2
i = 0

' Procedure
    For Each objSlicerCache In Workbooks(sDash).SlicerCaches
        For Each objSlicer In objSlicerCache.Slicers
            For i = LBound(varPTNames) To UBound(varPTNames)
               wkbDash.SlicerCaches(objSlicer).PivotTables.AddPivotTable (wksPivots.PivotTables(varPTNames(i, 1)))
            Next i
        Next objSlicer
    Next objSlicerCache

Основываясь на комментариях Боба, я изменил цикл, чтобы попытаться подключить сводные таблицы к объекту SlicerCache вместо слайсера.Я все еще получаю сообщение об ошибке № 424 «Требуется объект»

Пересмотренный цикл:

    For Each objSlicerCache In Workbooks(sDash).SlicerCaches
        For j = LBound(varPTNames) To UBound(varPTNames)
           objSlicerCache.PivotTables.AddPivotTable (wksPivots.PivotTables(varPTNames(j, 1)))
        Next j
    Next objSlicerCache

Основное обновление: Я пересмотрел код и очень близок.Новая последовательность кода:
1. Создайте 1 PivotCache
2. Используйте PivotCache для создания многих сводных таблиц
3. Создайте 1 SlicerCache из первой сводной таблицы
4. Добавьте дополнительные сводные таблицы в SlicerCache
5. Циклчерез каждую сводную таблицу в SlicerCache и создайте срез.

Хорошая новость: весь этот код работает.Он создает много слайсеров, и каждый слайсер фильтрует все сводные таблицы

Проблема: Все слайсеры фильтруют только одно поле (см. Изображение), а не каждый слайсер, предоставляющий отдельное поле дляфильтр.

Код:

   For Each objSlicerCache In wkbDash.SlicerCaches
        objSlicerCache.Delete
    Next objSlicerCache

    sRF = Worksheets(sDefPivots).Range("B2").Value
    sPT = Worksheets(sDefPivots).Range("A2").Value

    Set objPT = Worksheets(sPivots).PivotTables(sPT)
    Set objPF = Worksheets(sPivots).PivotTables(sPT).PivotFields(sRF)

    Set objSlicerCache = wkbDash.SlicerCaches.Add(objPT, objPF.Name)

    Set objPT = Nothing
    Set objPF = Nothing

    For Each objPT In Worksheets(sPivots).PivotTables
        objSlicerCache.PivotTables.AddPivotTable objPT
    Next objPT

    For Each objSlicerCache In wkbDash.SlicerCaches
        For Each objPT In objSlicerCache.PivotTables
            objSlicerCache.Slicers.Add wksSlicers, , objPT.Name, objPT.Name, 1, 1, 50, 100
        Next objPT
    Next objSlicerCache

Снимок экрана фильтров

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Решенные проблемы
Шаги кода:
1. Создание сводных таблиц из одного сводного кэша
2. Для каждой сводной таблицы создайте кэш среза
3. Для каждогоКэш слайсера, создайте слайсер
4. Для каждого кэша слайсера выполните цикл по сводным таблицам и добавьте их в SC

Код:

' Procedure

    For Each objSlicerCache In wkbDash.SlicerCaches
        objSlicerCache.Delete
    Next objSlicerCache

    varSlicers = wksDefPivots.Range("A2:B" & CStr(FindLastRow(wksDefPivots))).Value2
    For i = LBound(varSlicers, 1) To UBound(varSlicers, 1)
        Set objPT = Worksheets(sPivots).PivotTables(CStr(varSlicers(i, 1)))
        Set objPF = Worksheets(sPivots).PivotTables(CStr(varSlicers(i, 1))).PivotFields(CStr(varSlicers(i, 2)))
        Set objSlicerCache = wkbDash.SlicerCaches.Add(objPT, objPF.Name) 'Create SlicerCache for each Pivot Table
    Next i

    For Each objSlicerCache In wkbDash.SlicerCaches
        For Each objPT In objSlicerCache.PivotTables
            objSlicerCache.Slicers.Add wksSlicers, , objPT.Name, objPT.Name, 1, 1, 50, 100 'Add Slicers for each Pivot Table
        Next objPT
    Next objSlicerCache

    Set objSlicerCache = Nothing
    Set objPT = Nothing

    Call FormatSlicers(sSlicers) 'Format size & location of slicers

   For Each objSlicerCache In wkbDash.SlicerCaches
        For Each objPT In wksPivots.PivotTables
                objSlicerCache.PivotTables.AddPivotTable objPT 'Add every Pivot Table to every SlicerCache
        Next objPT
    Next objSlicerCache
0 голосов
/ 13 сентября 2018

Глядя на этот документ очевидно, что у вас есть проблема с синтаксисом.Чтобы получить отдельный Slicer объект:

wkbDash.SlicerCaches("someString")

Это соответствует общему синтаксису Collection:

myCollection("aKeyValue")

Или:

myCollection(anOffsetInteger)

Вы являетесьпомещение ссылки на объект в качестве значения ключа, а не строки или целого числа.

Теперь PivotTables - это коллекция, связанная с одним объектом SlicerCache.Ваш внешний For Each итерирует их, поэтому, если вы собираетесь добавлять сводную таблицу в каждой итерации, вам нужно сделать это для вашего итерированного объекта, поэтому:

For Each objSlicerCache In Workbooks(sDash).SlicerCaches
    For i = LBound(varPTNames) To UBound(varPTNames)
           objSlicerCache.PivotTables.AddPivotTable (wksPivots.PivotTables(varPTNames(i, 1)))
    Next i
Next objSlicerCache

Вы не можетеВыполните итерацию коллекции Slicers в каждом объекте SlicerCache внутри цикла и добавьте сводную таблицу к отдельным объектам Slicer, поскольку объектная модель не настроена для непосредственного связывания объекта Slicer с PivotTable объект.Если вы посмотрите в документ, вы увидите, что объект SlicerCache имеет свойство PivotTables, а объекты Slicers и Slicer - нет.

...