Excel VBA取消选择所有切片器选项(1除外)

Excel VBA取消选择所有切片器选项(1除外),excel,vba,slicers,Excel,Vba,Slicers,下面的代码给出了一个奇怪的结果。 切片器的顶部有22个选项1,底部有22个选项 如果我当前选择了12个,然后运行代码,它将选择切片器选项1-12。如果X=当前选择的切片器选项的值,代码将选择1-X,并且下面的选项保持未选择状态。以上只是一个例子,并不意味着要显示一个自然的或期望的起点 其他可能相关的信息: Multiselect=True, 第二个至底部选项=, 最后一个选项-空白 我想让代码做的是选择从第三个到最后一个选项,这是从底部开始的第一个选项,它不是空白或空数据。这解释了注释掉的行 但

下面的代码给出了一个奇怪的结果。 切片器的顶部有22个选项1,底部有22个选项

如果我当前选择了12个,然后运行代码,它将选择切片器选项1-12。如果X=当前选择的切片器选项的值,代码将选择1-X,并且下面的选项保持未选择状态。以上只是一个例子,并不意味着要显示一个自然的或期望的起点

其他可能相关的信息: Multiselect=True, 第二个至底部选项=, 最后一个选项-空白

我想让代码做的是选择从第三个到最后一个选项,这是从底部开始的第一个选项,它不是空白或空数据。这解释了注释掉的行

但是,我不明白为什么下面的代码没有取消选择所有选项

Sub Slicer()

Dim WB As Workbook
Set WB = ThisWorkbook
Dim i As Integer
Dim n As Integer



With WB.SlicerCaches("Slicer_Processed_date")
    n = .SlicerItems.Count

    For i = 1 To n
        If .SlicerItems(i).Selected = True Then
            .SlicerItems(i).Selected = False
        End If
    Next i

   '.SlicerItems(n - 2).Selected = True
End With   
End Sub

不能取消选择所有项目。必须始终保持一个项目可见,否则VBA将抛出错误

如果您想要现成的代码来过滤阵列上的切片器,请查看我的答案

如果您愿意,该数组中可以只包含一个内容。代码中的注释将帮助您了解如何高效地过滤切片器

编辑:现在我了解了您的需要,请使用以下命令:

Sub SliceByIndex()


Dim sc As SlicerCache
Dim si As SlicerItem
Dim l As Long
Dim i As Long

Set sc = ThisWorkbook.SlicerCaches("Slicer_Test")

l = sc.SlicerItems.Count
With sc
    .PivotTables(1).ManualUpdate = True 'Stops PivotCache recalculating until we are done

    ' Select the first item, because one item MUST remain visible at all times.
    ' We'll unselected it when we're done
    .SlicerItems(1).Selected = True

    'Deselect everything else
    For i = 2 To l
        .SlicerItems(i).Selected = False
    Next i

    'Select the desired item
    .SlicerItems(l - 2).Selected = True

    'Deselect the first items
    .SlicerItems(1).Selected = False

    'Turn the PivotCache calculation on again
    .PivotTables(1).ManualUpdate = False
End With


End Sub

根据项目在切片器中的位置而不是名称过滤切片器似乎很奇怪。你能详细说明你的意图吗?上面的宏是一个较大宏的子过程。所讨论的切片器项目是日期,宏只需选择最近的日期。我对VBA中的日期没有太多经验,因此由于缺乏经验,这可能是一项乏味的工作。在.refreshall之后的最近日期将始终是从底部开始的第三个选项,因此我使用了该选项。我不确定我的方法,只是在用我知道的东西工作。绝对可以用更直接的方法解决上述问题!可以正如任何一位伟大的电视厨师都会说的那样……这里有一个我之前准备好的:可能需要一些调整,我可能会有机会进行调整,但这应该会让你或其他读者开始阅读。不幸的是,我不懂很多代码,尽管我很想。我完全可以调整下面的答案来使用我的打开1,关闭其余的,在n-2上打开所需的选项,然后关闭1。这将产生一致的结果,我必须检查以确保本月1号正常工作。您是否知道这种方法是否比您上面链接的更直接的方法慢?切片机是一个每月跟踪,所以它最多有22个工作日。我可以在几个小时内测试这一点。如果我想为两个切片器运行完全相同的代码,我可以将其添加到行集合sc=thishworkbook.slicercacheslicer\u 1,Slicer\u 2否…不能将一个切片器设置为一件事。相反,您需要稍微修改代码,以便为其提供一个数组,然后查找SomeArray中的每个sc。今天我将修改代码来说明如何修改。最后一条注释应该说明不能将一个切片机设置为多个切片机thing@urdearboy这两个切片器是否共享相同的数据源?或者它们是完全不同的数据源?@jeffreyweir嘿,很好的解决方案,但我有一个问题。当我想要的项目是第一个项目时,代码选择所有项目。如何解决这个问题?