Как выбрать один слайсер = true, а остальные = false в VBA

Попытка сузить этот сценарий VBA без необходимости перечислять файлы . Я основной пользователь макросов. Как я могу получить одно выбранное = True, а остальные = False, не перечисляя все 160?

With ActiveWorkbook.SlicerCaches("Slicer_Organization")
    .SlicerItems("900110 - Danish Bemidji ").Selected = True
    .SlicerItems("900101 - Arabic Bemidji").Selected = False
    .SlicerItems("900105 - Chinese Callaway 1st Half").Selected = False
    .SlicerItems("900106 - Chinese Callaway 2nd Half").Selected = False
    .SlicerItems("900115 - Finnish Bemidji ").Selected = False
    .SlicerItems("900120 - French Bemidji 1st Half ").Selected = False
    .SlicerItems("900121 - French Bemidji 2nd Half ").Selected = False

person Kathy    schedule 24.07.2018    source источник


Ответы (3)


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

В этом коде показано, как фильтровать слайсер в массиве с именем vSelection. Чтобы внести поправки в соответствии с вашими потребностями, просто измените строку vSelection = Array("B", "C", "E") так, чтобы она содержала интересующие вас элементы.

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")

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
person jeffreyweir    schedule 25.07.2018

Вы можете перебрать все SlicerItems в своем SlicerCache, используя цикл For Each:

Dim si as SlicerItem

For Each si In ActiveWorkbook.SlicerCaches("Slicer_Organization").SlicerItems
    si.Selected = (si.Name = "900110 - Danish Bemidji")
Next si

Этот (si.Name = "900110 - Danish Bemidji") вернет True или False и установит свойство Selected SlicerItem, которое вы итерируете соответствующим образом.

person JNevill    schedule 24.07.2018
comment
Как насчет того, чтобы после каждого фрагмента данных я хотел сохранить файл (скрывая все остальные параметры слайсера от пользователя).... так что я хочу файл с именем 900110 - датский бемиджи и следующий 900115 - финский бемиджи и так далее? Нужно ли каждый раз открывать книгу? - person Kathy; 25.07.2018
comment
Зачем тогда использовать слайсер? Вместо этого просто перейдите прямо к сводному кешу и отфильтруйте, создайте новую книгу, скопируйте, вставьте, закройте новую книгу с любым именем, промойте и повторите. Слайсеры — это пользовательский интерфейс для нас, людей, но если вы просто пытаетесь программно отфильтровать сводную кэш-память и зафиксировать результаты, то это потребует больших затрат. - person JNevill; 25.07.2018
comment
@JNevilJNevil, как управлять вашим решением, чтобы элемент был выбран так, как вы опубликовали, но для других элементов должно быть установлено значение false? - person Tomz; 11.12.2020

person    schedule
comment
Могу ли я попросить вас добавить еще немного контекста вокруг вашего ответа. Ответы, содержащие только код, трудно понять. Если вы добавите больше информации в свой пост, это поможет как автору вопроса, так и будущим читателям. См. также Объяснение полностью основанных на коде ответов. - person help-info.de; 18.06.2021