Просто один на один, я впервые задаю вопрос на форуме. Так что заранее извиняюсь, если я не соблюдаю этикет.
У меня есть 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