Excel VBA:检测select了哪些切片器并存储到arrays中

是否有更有效的方法来检测/听取用户在切片机中select的内容? 我想将它们的select存储到一个数组中,最好是按照他们给定的sliceeritem名称,而不是由我决定的。 在这个例子中,切片机仅限于3个,但在我的实际工作表中,每个切片机只有10-20个。

在这里输入图像描述

Function slicerReader() Dim slicerArray(2) As Variant ' 0 for Age, 1 for State Worksheets(1).Select If ThisWorkbook.SlicerCaches("Slicer_Age").SlicerItems("20").Selected = True And ThisWorkbook.SlicerCaches("Slicer_Age").SlicerItems("20").Selected = True And ThisWorkbook.SlicerCaches("Slicer_Age").SlicerItems("30").Selected = True Then slicerArray(0) = "All" ElseIf ThisWorkbook.SlicerCaches("Slicer_Age").SlicerItems("20").Selected = True Then slicerArray(0) = 20 ElseIf ThisWorkbook.SlicerCaches("Slicer_Age").SlicerItems("25").Selected = True Then slicerArray(0) = 25 Else slicerArray(0) = 30 End If Debug.Print slicerArray(0) If ThisWorkbook.SlicerCaches("Slicer_State").SlicerItems("California").Selected = True And ThisWorkbook.SlicerCaches("Slicer_State").SlicerItems("Florida").Selected = True And ThisWorkbook.SlicerCaches("Slicer_State").SlicerItems("Texas").Selected = True Then slicerArray(1) = "All" ElseIf ThisWorkbook.SlicerCaches("Slicer_State").SlicerItems("California").Selected = True Then slicerArray(1) = "California" ElseIf ThisWorkbook.SlicerCaches("Slicer_State").SlicerItems("Florida").Selected = True Then slicerArray(1) = "Florida" Else slicerArray(1) = "Texas" End If Debug.Print slicerArray(1) slicerReader = slicerArray End Function 

这个代码显然不起作用,因为用户仍然有可能select切片机(1,3)或(2,3)等的组合

是否有任何可能的方式来遍历每个切片材料,并检查它们是否是真的,然后将其存储到一个数组? 对于每一个slicercache可能将是一个multidimensional array。 思考? 指针? :d

尝试这样的事情。 它将遍历状态切片器中的选定项目。

 For Each x In ActiveWorkbook.SlicerCaches("Slicer_State").SlicerItems If x.Selected = True Then a = x.Value End If 

下一个x

Snoobie,我会build议你将切片器的值存储在一个字典中,而不是一个数组。 字典比数组更灵活,因为它具有Exists函数。 我会给你一个字典的例子。 沿着相同的路线,你可以做一个数组的工作。

 Function slicerReader() As Dictionary 'add a reference to the Microsoft Scripting Runtime Library Dim sc As SlicerCache Dim si As SlicerItem Dim dctStates As New Dictionary Set sc = ActiveWorkbook.SlicerCaches("Slicer_State") For Each si In sc.SlicerItems If si.Selected Then dctStates.Add si.Value, si.Value End If Next Debug.Print dctStates.Exists("California") Set slicerReader = dctStates End Function