VBA изменить выбор элемента слайсера - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в VBA и мне нужно научиться автоматически изменять выбранные значения на слайсере. Сначала я попробовал с очень простым, но я попробовал все возможные варианты следующего кода и всегда получаю ошибку 1004, на этот раз «ошибка приложения или объекта»

Sub SlicerSelect()
    With ActiveWorkbook.SlicerCaches("Slicer_Time")
        .SlicerItems("2016").Selected = False
    End With
End Sub

У кого-нибудь есть идея? Здесь также изображение моего слайсера и его настройки.

Кстати, это работает, когда я использую команду .ClearManualFilter.

Большое спасибо!

Вот также запись макроса, отфильтровывая вручную мои элементы:

Sub Macro2()
' Macro2 Macro
ActiveWorkbook.SlicerCaches("Slicer_Time2").VisibleSlicerItemsList = Array( _
    "[Booking Period].[Time].[YEAR].&[2018]")
End Sub

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Ваша проблема заключалась в том, что существует два разных типа сводных таблиц:

  • Сводные таблицы, основанные на диапазонах, которые используют код, который вы изначально размещены, и это позволяет вам передавать в отдельные сводные элементы по одному; и
  • Сводные таблицы на основе модели данных (т.е. PowerPivot) или кубов OLAP, которые используют совершенно другой синтаксис, где вы должны передать в массив, показывающий ВСЕ элементы, которые вы хотите видеть, используя гораздо больше запутанный синтаксис.
0 голосов
/ 05 июля 2018

Фильтрация SlicerItems может быть непростой задачей, потому что хотя бы один элемент должен оставаться видимым в любое время. Этот код показывает, как фильтровать слайсер в массиве с именем vSelection, и покажет, как вам нужно это сделать.

Option Explicit

Sub FilterSlicer()
Dim slr As Slicer
Dim sc As SlicerCache
Dim si As SlicerItem
Dim i As Long
Dim vItem As Variant
Dim vSelection As Variant

Set sc = ActiveWorkbook.SlicerCaches("Slicer_ID")
'Set sc = slr.SlicerCache

vSelection = Array("B", "C", "E")

For Each pt In sc.PivotTables
    pt.ManualUpdate = True 'Stops PivotTable from refreshing after each PivotItem is changed
Next pt

With sc

    'At least one item must remain visible in the Slicer at all times, so make the first
    'item visible, and at the end of the routine, check if it actually  *should* be visible
    .SlicerItems(1).Selected = True

    'Hide any other items that aren't already hidden.
    'Note that it is far quicker to check the status than to change it.
    ' So only hide each item if it isn't already hidden
    For i = 2 To .SlicerItems.Count
        If .SlicerItems(i).Selected Then .SlicerItems(i).Selected = False
    Next i

    'Make the PivotItems of interest visible
    On Error Resume Next 'In case one of the items isn't found
    For Each vItem In vSelection
        .SlicerItems(vItem).Selected = True
    Next vItem
    On Error GoTo 0

    'Hide the first PivotItem, unless it is one of the countries of interest
    On Error Resume Next
    If InStr(UCase(Join(vSelection, "|")), UCase(.SlicerItems(1).Name)) = 0 Then .SlicerItems(1).Selected = False
    If Err.Number <> 0 Then
        .ClearAllFilters
        MsgBox Title:="No Items Found", Prompt:="None of the desired items was found in the Slicer, so I have cleared the filter"
    End If
    On Error GoTo 0
End With


For Each pt In sc.PivotTables
    pt.ManualUpdate = False
Next pt

End Sub
...