首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过VBA迭代切片器,每次选择一个条目。

通过VBA迭代切片器,每次选择一个条目。
EN

Stack Overflow用户
提问于 2015-10-27 17:22:46
回答 3查看 19.8K关注 0票数 1

我在一个电子表格中有几个切割机。我希望能够通过VBA循环其中的一个,并逐个选择每个选项。在我疲惫的眼睛中,下面的宏看起来很好,但是当我运行它时,它显然不起作用。当我在下面的“断点”标签上添加一个断点时,第一项被选中,但是宏在保持第一项被选中的同时转到第二项,最后我选择了我的所有项目.

代码语言:javascript
复制
    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所指出的,在选择新项目时,我只需要清除过滤器(slBox.ClearManualFilter)。

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

下面的代码运行良好:

代码语言:javascript
复制
    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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-27 18:08:52

由于我在评论中也将你联系在一起的问题没有被接受的答案(用户从来不选择回答或回答我的建议),所以我也会在这里为您的问题提供解决方案。

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2015-10-27 17:54:14

您确实可以在excel电子表格中有几个选定的项。您发布的代码除了选择满足slDummy.Name = slItem.Name的所有项之外,什么也不做。

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

您还可能希望在第一阶段选择所需的所有项,然后运行一个循环,该循环只访问属性.selected设置为true的项。但是,执行的时间可能会更长,因为还会有一个循环。

票数 0
EN

Stack Overflow用户

发布于 2020-10-02 10:13:41

我试过了上面的解决方案,但没能让它们起作用。我一直得到一个1004对象未定义的错误;可能是因为我使用的是数据模型。最后,我拼凑了这个解决方案,它从一个范围内获取切片器的值,然后调用另一个宏保存在pdf中(这是我的最终目标)。不是优雅,而是有效。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33374563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档