Excel VBA-返回切片器中的选定元素
我有一个叫做“切片机头”的切片机。我只需要能够用所选元素的值在VBA中调暗变量。一次只能选择一个元素 我在通过VBA从切片器中动态选择和取消选择元素时遇到了很多问题,因为我的透视表连接到外部数据源。我不知道这是否与这个确切的例子有关,但是这个表连接到同一个外部数据源 我以前只有一行代码,可以返回这个值,但现在我所能找到的只是需要遍历切片器中的每个元素,并检查它是否被选中。我希望避免这种情况,因为我一次只能选择一个元素Excel VBA-返回切片器中的选定元素,vba,excel,Vba,Excel,我有一个叫做“切片机头”的切片机。我只需要能够用所选元素的值在VBA中调暗变量。一次只能选择一个元素 我在通过VBA从切片器中动态选择和取消选择元素时遇到了很多问题,因为我的透视表连接到外部数据源。我不知道这是否与这个确切的例子有关,但是这个表连接到同一个外部数据源 我以前只有一行代码,可以返回这个值,但现在我所能找到的只是需要遍历切片器中的每个元素,并检查它是否被选中。我希望避免这种情况,因为我一次只能选择一个元素 当前状态: 确定要查找错误,我们将后退一步,删除我的函数并尝试通过以下项目
当前状态:
确定要查找错误,我们将后退一步,删除我的函数并尝试通过以下项目循环:
Dim sC As SlicerCache
Dim SL As SlicerCacheLevel
Dim sI As SlicerItem
Set sC = ActiveWorkbook.SlicerCaches("Slicer_Dates_Hie")
Set SL = sC.SlicerCacheLevels(1)
For Each sI In SL.SlicerItems
sC.VisibleSlicerItemsList = Array(sI.Name)
Next
这就是我所做的:
Public Function GetSelectedSlicerItems(SlicerName As String) As String
Dim SL As SlicerCacheLevel
Dim sI As SlicerItem
Set SL = ActiveWorkbook.SlicerCaches(SlicerName).SlicerCacheLevels(1)
For Each sI In SL.SlicerItems
If sI.Selected = True Then
GetSelectedSlicerItems = (sI.Value)
End If
Next
End Function
Dim sValue As String
sValue = GetSelectedSlicerItems("Slicer_HeaderTitle")
感谢Doktor OSwaldo对我的帮助 我想存两分钱。可见切片器项集可以通过两个独立的操作进行收缩:
。选择的方法
.HasData
方法切片机产品(苹果、香蕉),因为其他切片机切片机产品类型
在水果
上有活动过滤器。方法sI.Selected
仍将返回苹果、香蕉、胡萝卜
如果希望两个限制都到位,则将两个集相交。我已经修改了TobiasKnudsen代码(非常好的答案!),以返回由于上述两个限制而缩小的项目列表<代码>如果sI.Selected=True且sI.HasData=True,则
是此代码中的关键行
Option Explicit
Sub TestExample()
Dim MyArr() As Variant
MyArr = ArrayListOfSelectedAndVisibleSlicerItems("Slicer_A")
'now variable MyArr keeps all items in an array
End Sub
Public Function ArrayListOfSelectedAndVisibleSlicerItems(MySlicerName As String) As Variant
'This function returns an array of the limited set of items in Slicer A
'Limitation is due to both:
'(1) direct selection of items by user in slicer A
'(2) selection of items in slicer B which in consequence limits the number of items in slicer A
Dim ShortList() As Variant
Dim i As Integer: i = 0 'for iterate
Dim sC As SlicerCache
Dim sI As SlicerItem 'for iterate
Set sC = ThisWorkbook.Application.ActiveWorkbook.SlicerCaches(MySlicerName)
For Each sI In sC.SlicerItems
If sI.Selected = True And sI.HasData = True Then 'Here is the condition!!!
'Debug.Print sI.Name
ReDim Preserve ShortList(i)
ShortList(i) = sI.Value
i = i + 1
End If
Next sI
ArrayListOfSelectedAndVisibleSlicerItems = ShortList
End Function
子演示()
作为整数的Dim i
使用ActiveWorkbook.SlicerCache(“切片器国家”)
对于i=1到.ms.Count
如果选择了.ms(i).则
工作表(“轴工作表”).Range(“I”和I)=切片选择和切片属性(I).Value
如果结束
接下来我
以
端接头
谢谢您的详细回答。我有个小问题。我一直收到消息“No items selected”。这不是很有帮助,在For each后面添加debug.print osi.Name,看看切片器中的每个元素是否都存在,然后检查所选元素是否已selected=true。我在原始帖子的底部添加了我的代码和错误的图片!我在“Set SL=sC.slicercachevels(2)”上得到错误代码,但是如果我将cachelevels更改为1,则它会输出切片器中的每个元素。像现在这样尝试,它是否工作?很抱歉,我无法访问切片机atm,因此我必须猜测一个位这有点多余:ThisWorkbook.Application.ActiveWorkbook
。除此之外,干得不错+1不,它不是多余的。我是通过艰苦的方式学会的。有时,您可能安装了一些在后台工作的加载项,这些加载项可能会更改活动工作簿。如果您使用此工作簿,您是安全的。
Option Explicit
Sub TestExample()
Dim MyArr() As Variant
MyArr = ArrayListOfSelectedAndVisibleSlicerItems("Slicer_A")
'now variable MyArr keeps all items in an array
End Sub
Public Function ArrayListOfSelectedAndVisibleSlicerItems(MySlicerName As String) As Variant
'This function returns an array of the limited set of items in Slicer A
'Limitation is due to both:
'(1) direct selection of items by user in slicer A
'(2) selection of items in slicer B which in consequence limits the number of items in slicer A
Dim ShortList() As Variant
Dim i As Integer: i = 0 'for iterate
Dim sC As SlicerCache
Dim sI As SlicerItem 'for iterate
Set sC = ThisWorkbook.Application.ActiveWorkbook.SlicerCaches(MySlicerName)
For Each sI In sC.SlicerItems
If sI.Selected = True And sI.HasData = True Then 'Here is the condition!!!
'Debug.Print sI.Name
ReDim Preserve ShortList(i)
ShortList(i) = sI.Value
i = i + 1
End If
Next sI
ArrayListOfSelectedAndVisibleSlicerItems = ShortList
End Function