简体   繁体   English

VBA更改Slicer项目选择

[英]VBA change Slicer item selection

I´ma newbie with VBA and need to learn how to change automatically the selected values on a Slicer. 我是VBA的新手,需要学习如何在Slicer上自动更改所选值。 I first tried with a very simple one, but I tried every variation possible to the following code and always get an error 1004, this time "application-defined or object-defined error" 我首先尝试了一个非常简单的方法,但是尝试了以下代码的所有可能变化,并始终收到错误1004,这一次是“应用程序定义的错误或对象定义的错误”

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

Does someone have an idea ? 有人有主意吗? Here is also an image of my slicer and its settings. 也是切片器及其设置的图像。

By the way, it works when I'm using the .ClearManualFilter command. 顺便说一句,当我使用.ClearManualFilter命令时,它可以工作。

Thanks a lot ! 非常感谢 !

Here is also a macro record by filtering manually my items : 这也是通过手动过滤我的物品的宏记录:

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

Filtering SlicerItems can be tricky, because at least one item must remain visible at all times. 过滤SlicerItems可能很棘手,因为至少有一项必须始终保持可见。 This code shows how to filter a Slicer on an array called vSelection, and will show you how you need to accomplish this. 这段代码显示了如何过滤名为vSelection的数组上的Slicer,并向您展示了如何实现此目的。

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

Your problem was that there are two different types of PivotTables: 您的问题是有两种不同类型的数据透视表:

  • PivotTables based on ranges, that use the kind of code you initially posted, and that let you pass in individual PivotItems one at a time; 基于范围的数据透视表,该数据透视表使用您最初发布的代码类型,并且一次可以传递一个单独的PivotItem。 and
  • PivotTables based on the Data Model (ie PowerPivot) or OLAP cubes, that use a completely different syntax where you have to pass in an array showing ALL of the items you want visible, using a much more confusing syntax. 基于数据模型(即PowerPivot)或OLAP多维数据集的数据透视表,它们使用完全不同的语法,其中您必须使用更加混乱的语法来传递一个数组,该数组显示要显示的所有项目。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM