VBA将切片器选择更改为当前选定项

VBA将切片器选择更改为当前选定项,vba,excel,excel-2010,Vba,Excel,Excel 2010,下面的行为非常奇怪。 其目的是使切片器只保留指定的项目(在本例中为“Smith”),而不选择所有其他名称。 大多数情况下,它都可以工作,但有时会选择多个项目 下面的问题是什么?我如何实现所需的行为 Sub myRoutine() unselectAllBut "Slicer_InitialAcc_Surname", "me" End Sub Public Sub unselectAllBut(slicerName As String, newSelection As String)

下面的行为非常奇怪。
其目的是使切片器只保留指定的项目(在本例中为“Smith”),而不选择所有其他名称。
大多数情况下,它都可以工作,但有时会选择多个项目

下面的问题是什么?我如何实现所需的行为

Sub myRoutine()
    unselectAllBut "Slicer_InitialAcc_Surname", "me"  
End Sub

Public Sub unselectAllBut(slicerName As String, newSelection As String)

Dim si As Object
For Each si In ActiveWorkbook.SlicerCaches(slicerName).SlicerItems
    si.Selected = (si.Caption = newSelection)
Next si

End Sub
第二次尝试也不起作用:

Public Sub unselectAllBut(slicerName As String, newSelection As String)

Dim i As Integer
With ActiveWorkbook.SlicerCaches(slicerName)
    For i = 1 To .SlicerItems.Count
        .SlicerItems(i).Selected = (.SlicerItems(i).Caption = newSelection)
    Next i
End With

End Sub
可能是数据造成了问题。如下所示:


编辑

下面的方法似乎有效。我首先选择所有项目,这似乎是过度杀戮:

Public Sub unselectAllBut(slicerName As String, newSelection As String)

Dim i As Integer

With ActiveWorkbook.SlicerCaches(slicerName)
    For i = 1 To .SlicerItems.Count
        .SlicerItems(i).Selected = True
    Next i
    For i = 1 To .SlicerItems.Count
        .SlicerItems(i).Selected = (.SlicerItems(i).Caption = newSelection)
    Next i
End With

End Sub
快一点的方法:

  • 首先设置新选项
  • 第二,清除所有其他
Public Sub unselectAllBut(slicerName作为字符串,newSelection作为字符串)

作为整数的Dim i 使用ActiveWorkbook.SlicerCache(slicerName) 对于i=1到.ms.Count 如果.SlicerItems(i).Caption=newSelection,那么.SlicerItems(i).Selected=True:退出 接下来我 对于i=1到.ms.Count 如果.SlicerItems(i).Selected和.SlicerItems(i).Caption newSelection,则.SlicerItems(i).Selected=False 接下来我 以 端接头
Public Sub unselectAllBut(slicerName As String, newSelection As String)

Dim i As Integer With ActiveWorkbook.SlicerCaches(slicerName) For i = 1 To .SlicerItems.Count If .SlicerItems(i).Caption = newSelection Then .SlicerItems(i).Selected = True: Exit For Next i For i = 1 To .SlicerItems.Count If .SlicerItems(i).Selected And .SlicerItems(i).Caption <> newSelection Then .SlicerItems(i).Selected = False Next i End With End Sub