【问题标题】:VBA De-Select All Slicer Options (except 1)VBA 取消选择所有切片器选项(1 除外)
【发布时间】:2018-05-01 18:42:28
【问题描述】:

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

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

其他可能相关的信息: 多选 = 真, 倒数第二个选项 = "", 最后一个选项-“空白”

我想要代码做的是选择倒数第三个选项,这是第一个(从底部)不是空白或空数据的选项。这解释了注释掉的行。

但是,我无法弄清楚为什么下面的代码没有取消选择所有选项。

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 中的日期没有太多经验,因此由于缺乏经验,这可能是一项乏味的工作。最近的日期(在 .refreshall 之后)将始终是倒数第三个选项,所以我使用了它。我并没有确定我的方法,只是在使用我所知道的。绝对愿意以更直接的方法解决上述问题!
  • 好的。正如任何一位出色的电视厨师都会说的那样……“这是我之前准备的”:stackoverflow.com/questions/39004607/…
  • 可能需要一些调整,我可能有机会进行调整,但这应该能让你或其他读者开始。
  • 不幸的是,我不懂很多代码,虽然我想。我绝对可以调整以下答案以使用我的(打开#1,关闭其余选项,打开所需的选项(#n-2),然后关闭#1)。这应该会产生一致的结果,但必须检查以确保每月 1 日正常工作。您是否知道这种方法是否会比您上面链接的更直接的方法慢?切片器是一个月度跟踪器,所以它最多有 22 个日期(一个月的工作日)。

标签: excel vba slicers


【解决方案1】:

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

如果您想要现成的代码来过滤数组上的切片器,请查看我在How to update slicer cache with VBA 的回答

如果您愿意,该数组可以只包含一个东西。该代码中的 cmets 将帮助您了解如何有效地过滤切片器。

编辑:既然我了解了您的需求,请使用:

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

【讨论】:

  • 我可以在几个小时内进行测试。如果我想为 2 个切片器运行完全相同的代码,我可以将它添加到“Set sc = Thisworkbook.SlicerCaches("Slicer_1", "Slicer_2") 行中吗
  • 不...你不能设置一个切片缓存等于一件事。相反,您需要稍微修改代码,以便为它提供一个数组,然后转到For each sc in SomeArray。我今天将修改代码以说明如何。
  • 最后一条评论应该说你不能将一个切片缓存设置为超过一件事
  • @urdearboy 这两个切片器是否共享相同的数据源?还是它们是完全不同的数据源?
  • @jeffreyweir 嘿,很好的解决方案,但我有一个问题。当我想要的项目是第一个项目时,代码会选择所有项目。如何解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多