我的电子表格中有几个切片器。我希望能够通过 VBA 循环其中一个,并一一选择每个选项。
下面的宏对我疲惫的眼睛来说似乎很好,但当我运行它时它显然不起作用。当我在下面的“BREAKPOINT”标记处添加断点时,第一个项目被选中,但随后宏转到第二个项目,同时保持第一个项目被选中,最终我选择了所有项目...
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
感谢您的帮助
EDIT:
正如 Scott Holtzman 所指出的,事实证明我只需要在选择新项目时清除过滤器(slBox.ClearManualFilter)。
为什么这是必要的,而当我 debug.print 时布尔测试可以正常工作?
下面的代码工作正常:
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
由于我在评论中也链接到您的问题没有公认的答案(用户从未选择回答或回复我的建议),因此我也将在这里提供您问题的解决方案。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)