在切片器中选择多个项目

时间:2016-06-02 15:57:54

标签: excel vba

我有工作代码从切片器中选择单个项目,但它不适用于多个项目。

通过读取范围中的哪些单元格以粗体显示并填充字符串数组STP(46),填充直到STP(k)来设置选择。这很好。

然后代码应该取消选择切片器中不在STP中的所有项目,并选择那些项目。这适用于一个选择,但不适用于多个选择 - 它会错误地选择所有项目,直到最后一个项目被选中。

code = [1,2,4,7,2,6,8]
new_code = []

for i in range(0, len(code), 2):  ### iterate over even indexes
   new_code.append(code[i])

print new_code

因此,不是选择切片器中的第2和第4项,而是选择第1,第2,第3,第4项,并取消选择其余项。

我需要使用这样的循环技术,因为我需要能够将这个代码用于具有不同缓存名称但具有相同项目列表的多个切片器。

我到处寻找,上面的代码甚至来自另一个问题的解决方案。任何帮助非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以使用字典使流程更加流畅

With ActiveWorkbook.SlicerCaches("Slicer_test_id")
    Dim i
    For i = 1 To .SlicerItems.Count

        If .SlicerItems(i).Selected And Not stp.Exists(.SlicerItems(i).Caption) Then
            .SlicerItems(i).Selected = False
        End If

    Next i

    For i = 1 To .SlicerItems.Count
        If stp.Exists(.SlicerItems(i).Caption) Then
            .SlicerItems(i).Selected = True
        End If

    Next i
End With

我不清楚你为什么需要第一个循环。我正在阅读"然后代码应该取消选择切片器中不在STP中的所有项目,并选择那些是。" as"只选择STP中的那些图腾并取消选择所有其他图标"减少的代码将执行哪些操作:

With ActiveWorkbook.SlicerCaches("Slicer_test_id")
    Dim i
    For i = 1 To .SlicerItems.Count
        .SlicerItems(i).Selected = stp.Exists(.SlicerItems(i).Caption)
    Next i
End With

填充Dictionary非常简单

Dim stp As New Dictionary
stp.Add "73148", "73148"
stp.Add "73150", "73150"
stp.Add "73159", "73159"

您需要引用Microsoft Scripting Runtime

Tools > References C:\Windows\SysWOW64\scrrun.dll

请注意,如果您在列表中看不到Microsoft Scripting Runtime,则可以浏览到C:\Windows\SysWOW64\scrrun.dll