1

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

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

其他可能相关的信息:多选 = 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
4

1 回答 1

2

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

如果您想要现成的代码来过滤阵列上的切片器,请查看我在如何使用 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
于 2018-05-01T00:38:47.057 回答