Связывание фильтров из одного слайсера / сводной таблицы в другую - PullRequest
1 голос
/ 14 января 2020

Просто один на один, я впервые задаю вопрос на форуме. Так что заранее извиняюсь, если я не соблюдаю этикет.

У меня есть 3 сводные таблицы, каждая со своим набором данных, и у каждой есть 3 слайсера. Данные в сводных таблицах имеют разные значения и имеют другой размер. Однако есть 3 связывающих столбца с одинаковыми / похожими идентификаторами. Проект, Пакет и Дисциплина являются общими идентификаторами для всех трех наборов данных. Для каждого есть слайсер.

Я пытаюсь связать их через VBA. Я написал некоторый код, который должен циклически проходить через каждый фильтр в первом слайсере, если он выбран, то он должен выбрать соответствующий фильтр во втором слайсере. Я не могу понять, почему это не работает. Насколько я могу судить, это как-то связано с «для каждого элемента в Slicercache». Но кроме этого я не могу обернуть голову вокруг этого.

Я даже попробовал какой-то упрощенный код, просто чтобы проверить, что я понял основы, и это тоже не работает.

Упрощенный код:

'Sub Test()

Dim sc As SlicerCache
Dim si As SlicerItem

Set sc = ThisWorkbook.SlicerCaches("Slicer_Project")

For Each si In sc.SlicerItems
    If si.Selected = True Then
        si.Selected = False
    Else
        si.Selected = True
    End If
Next si

End Sub

Полный код:

Sub Sort_Slicers()
Dim Master_Slice As SlicerCache, Subject_Slice As SlicerCache
Dim Ctr As Integer, Ctr2 As Integer
Dim Sl_Item As SlicerItem
Dim wb As Workbook

TurnStuffOff

Set wb = ThisWorkbook

For Ctr = 1 To 3
    If Ctr = 1 Then
        Set Master_Slice = wb.SlicerCaches("Slicer_Project")
    ElseIf Ctr = 2 Then
        Set Master_Slice = wb.SlicerCaches("Slicer_Package")
    ElseIf Ctr = 3 Then
        Set Master_Slice = wb.SlicerCaches("Slicer_Disc")
    End If

    For Ctr2 = 1 To 2
        If Ctr2 = 1 Then
            If Ctr = 1 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Project1")
            ElseIf Ctr = 2 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Package1")
            ElseIf Ctr = 3 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Disc1")
            End If
        Else
            If Ctr = 1 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Project2")
            ElseIf Ctr = 2 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Package2")
            ElseIf Ctr = 3 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Disc2")
            End If
        End If

        Subject_Slice.ClearAllFilters

        On Error Resume Next
        For Each Sl_Item In Master_Slice.SlicerItems
            If Sl_Item.Selected = True Then
                Subject_Slice.Sl_Item.Selected = True
            Else
                Subject_Slice.Sl_Item.Selected = False
            End If
        Next Sl_Item
        On Error GoTo 0

    Next Ctr2
Next Ctr

TurnStuffOn
End Sub

1 Ответ

0 голосов
/ 06 февраля 2020

Просто чтобы все знали, я дошел до сути.

В коде не было ничего плохого, это был факт, что первая сводная таблица была загружена из таблицы данных. Я удалил сводку, сбросил ее, чтобы она читалась прямо из файла Excel, и она работала нормально.

...