【问题标题】:Select multiple items in a slicer在切片器中选择多个项目
【发布时间】:2016-06-02 15:57:53
【问题描述】:

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

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

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

With ActiveWorkbook.SlicerCaches("Slicer_STP_Name")
    For i = 1 To .SlicerItems.Count
        For j = 1 To k
            If .SlicerItems(i).Selected And .SlicerItems(i).Caption <> STP(j) Then .SlicerItems(i).Selected = False
        Next j
    Next i

    For i = 1 To .SlicerItems.Count
        For j = 1 To k
            If .SlicerItems(i).Caption = STP(j) Then .SlicerItems(i).Selected = True: Exit For
        Next j
    Next i
End with

因此,它不会选择切片器中的第 2 和第 4 个项目,而是选择第 1、2、3、4 个项目,然后取消选择其余项目。

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

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

【问题讨论】:

    标签: excel vba


    【解决方案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 中的所有项目,并选择那些在 STP 中的项目。”作为“仅选择 STP 中的那些 otems 并取消选择所有其他”,此简化代码将执行以下操作:

    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

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

    【讨论】:

    • @GabrielH 哪一行给你留言?
    • 谢谢布拉德,我已经实现了以下内容,它说“对象不支持此属性或方法”,我哪里出错了?将 stp2 作为新集合 stp2.Add "Buckinghamshire, Oxfordshire and Berkshire West", "Buckinghamshire, Oxfordshire and Berkshire West" stp2.Add "Cambridgeshire and Peterborough", "Cambridgeshire and Peterborough" With ActiveWorkbook.SlicerCaches("Slicer_STP_Name") For i = 1 To .SlicerItems.Count .SlicerItems(i).Selected = stp2.Exists(.SlicerItems(i).Caption) Next i End With
    • 给我信息的那一行是 .SlicerItems(i).Selected = stp2.Exists(.SlicerItems(i).Caption)
    • 对不起,我写了Collection,我应该写Dictionary
    • 啊,是的,明白了。现在完美而快速地工作,非常感谢。我的技术升级了 +1!
    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多