Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-返回切片器中的选定元素_Vba_Excel - Fatal编程技术网

Excel VBA-返回切片器中的选定元素

Excel VBA-返回切片器中的选定元素,vba,excel,Vba,Excel,我有一个叫做“切片机头”的切片机。我只需要能够用所选元素的值在VBA中调暗变量。一次只能选择一个元素 我在通过VBA从切片器中动态选择和取消选择元素时遇到了很多问题,因为我的透视表连接到外部数据源。我不知道这是否与这个确切的例子有关,但是这个表连接到同一个外部数据源 我以前只有一行代码,可以返回这个值,但现在我所能找到的只是需要遍历切片器中的每个元素,并检查它是否被选中。我希望避免这种情况,因为我一次只能选择一个元素 当前状态: 确定要查找错误,我们将后退一步,删除我的函数并尝试通过以下项目

我有一个叫做“切片机头”的切片机。我只需要能够用所选元素的值在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对我的帮助

我想存两分钱。可见切片器项集可以通过两个独立的操作进行收缩:

  • 用户选择切片器A中的项目。要捕获这些项目,请使用
    。选择的
    方法
  • 在切片器B中选择项目,从而缩小切片器A项目的列表。要捕获这些项目,请使用
    .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