通过VBA迭代切片机,每次select一个项目

我在铺面里有几个切片机。 我希望能够通过VBA循环其中之一,并逐一select每个选项。 下面的macros似乎对我疲倦的眼睛很好,但是当我运行它时显然不起作用。 当我在下面的'BREAKPOINT'标签处添加一个断点时,第一个项目被选中,但是这个macros在第一个项目被选中的同时保留第二个项目,最后我选中了所有的项目。

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指出的那样,我只需要在select一个新项目时清除filter(slBox.ClearManualFilter)。

为什么这是必要的,而布尔testing正常工作时,我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 

既然在我的评论中我也链接了你的问题没有一个可以接受的答案(用户从不select回答或回复我的build议),我也会在这里提供你的问题的解决scheme。

 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 

在Excel电子表格中的确可以有几个选定的项目。 您发布的代码不做任何事情,而不是select满足slDummy.Name = slItem.Name所有项目。

如果我理解的很好,一旦select了这个项目就想运行一些代码,然后转到下一个项目。 您可以通过在使用后取消select一个项目来实现这一点, item.selected = False

您可能还需要select第一阶段所需的所有项目,然后运行一个只会.selected具有.selected属性设置为true的项目的循环。 但是,如果你有一个循环,执行的时间可能会更长。