通过VBA迭代切片器并每次选择一个项目

时间:2015-10-27 17:22:46

标签: excel vba excel-vba

我在spreadhseet中有几个切片器。我希望能够通过VBA循环其中一个,并逐个选择每个选项。 下面的宏似乎对我疲惫的眼睛很好,但是当我跑的时候它显然不起作用。当我在下面的&#39; BREAKPOINT标记处添加断点时,第一个项目被选中,但是宏转到第二个项目,同时保持第一个选中,我最终选择了所有项目... < / p>

    Sub slicers(slName As String)
    Dim slItem As SlicerItem, slDummy As SlicerItem
    Dim slBox As SlicerCache
    Set slBox = ActiveWorkbook.SlicerCaches(slName)
    For Each slItem In slBox .SlicerItems
      For Each slDummy In slBox .SlicerItems
          slDummy.Selected = (slDummy.Name = slItem.Name)
      Next slDummy
    Next slItem 'BREAKPOINT
    End Sub

    Sub test()
    Call slicers("A_slicer_name")
    End Sub

感谢您的帮助

修改
正如Scott Holtzman所指出的那样,我只需要在选择新项目时清除过滤器(slBox.ClearManualFilter)。

为什么这是必要的,而布尔测试在我调试时会正常工作呢?

以下代码可以正常使用:

    Sub slicers(slName As String)
    Dim slItem As SlicerItem, slDummy As SlicerItem
    Dim slBox As SlicerCache
    Set slBox = ActiveWorkbook.SlicerCaches(slName)
    For Each slItem In slBox .SlicerItems
      slBox.ClearManualFilter 'THIS IS THE LINE I NEEDED TO ADD
      For Each slDummy In slBox .SlicerItems
          slDummy.Selected = (slDummy.Name = slItem.Name)
      Next slDummy
    Next slItem
    End Sub

    Sub test()
    Call slicers("A_slicer_name")
    End Sub

3 个答案:

答案 0 :(得分:6)

由于我在评论中与您联系的问题没有接受答案(用户从不选择回答或回复我的建议),我也会在此提供解决方案。

Sub slicers(slName As String)

    Dim slItem As SlicerItem, slDummy As SlicerItem
    Dim slBox As SlicerCache

    Set slBox = ActiveWorkbook.SlicerCaches(slName)

    'loop through each slicer item
    For Each slItem In slBox.SlicerItems

        'show all items to start
        slBox.ShowAllItems 'or .ClearManualFilter

        'test each item against itself
        For Each slDummy In slBox.SlicerItems

            'if the item equals the item in the first loop, then select it
            'otherwise don't show it (thus showing 1 at a time between the nested loops)
            If slItem.Name = slDummy.Name Then slDummy.Selected = True Else: slDummy.Selected = False

            'more code to process the data (I suspect)

        Next slDummy

    Next slItem

End Sub

答案 1 :(得分:0)

您可以在Excel电子表格中确实拥有多个所选项目。您发布的代码不执行任何操作,而是选择满足slDummy.Name = slItem.Name的所有项目。

如果我理解得很好,您希望在选择项目后运行一些代码,然后转到下一个项目。您可以通过使用item.selected = False取消选择一个项目来实现此目的。

您可能还希望选择第一阶段所需的所有项目,然后运行一个循环,该循环仅会影响属性.selected设置为true的项目。但是,执行起来可能会更长,因为你还有一个循环。

答案 2 :(得分:0)

我尝试了上述解决方案,但无法使其正常工作。 我不断收到未定义的1004对象错误;可能是因为我正在使用数据模型。 最后,我拼凑了这个解决方案,该解决方案从一个范围中获取切片器的值,然后调用另一个宏以pdf格式保存(这是我的最终目标)。 不优雅但有效。

Sub looop()

Dim rng As Range, cell As Range
Set rng = Sheet1.Range("B4:B5")
For Each cell In rng

ActiveWorkbook.SlicerCaches("Slicer_MasterBrand").VisibleSlicerItemsList = Array("[Customer].[MasterBrand].&[" & cell.Value & "]")

a_ExportPDF

Next cell
    
End Sub