【问题标题】:Linking filters from one slicer / pivot table, to another将过滤器从一个切片器/数据透视表链接到另一个
【发布时间】:2020-01-14 15:10:45
【问题描述】:

请注意,这是我第一次在论坛上提问。所以如果我不遵守礼仪,请提前道歉。

我有 3 个数据透视表,每个都有自己的数据集,每个都有 3 个切片器。 数据透视表中的数据具有不同的值并且具有不同的大小。但是,有 3 个链接列具有相同/相似的标识符。 Project、Package 和 Discipline 是 3 个数据集中的通用标识符。每个人都有一个切片机。

我正在尝试通过 vba 链接它们。我编写了一些代码,旨在循环通过第一个切片器中的每个过滤器,如果它被选中,那么它应该在第二个切片器中选择相应的过滤器。 我无法弄清楚为什么它不起作用。据我所知,它与“切片缓存中的每个项目”有关。但除此之外,我无法绕过它。

我什至尝试了一些简化的代码,只是为了检查我是否理解了基础知识,但这也不起作用。

简化代码:

'Sub Test()

Dim sc As SlicerCache
Dim si As SlicerItem

Set sc = ThisWorkbook.SlicerCaches("Slicer_Project")

For Each si In sc.SlicerItems
    If si.Selected = True Then
        si.Selected = False
    Else
        si.Selected = True
    End If
Next si

End Sub

完整代码:

Sub Sort_Slicers()
Dim Master_Slice As SlicerCache, Subject_Slice As SlicerCache
Dim Ctr As Integer, Ctr2 As Integer
Dim Sl_Item As SlicerItem
Dim wb As Workbook

TurnStuffOff

Set wb = ThisWorkbook

For Ctr = 1 To 3
    If Ctr = 1 Then
        Set Master_Slice = wb.SlicerCaches("Slicer_Project")
    ElseIf Ctr = 2 Then
        Set Master_Slice = wb.SlicerCaches("Slicer_Package")
    ElseIf Ctr = 3 Then
        Set Master_Slice = wb.SlicerCaches("Slicer_Disc")
    End If

    For Ctr2 = 1 To 2
        If Ctr2 = 1 Then
            If Ctr = 1 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Project1")
            ElseIf Ctr = 2 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Package1")
            ElseIf Ctr = 3 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Disc1")
            End If
        Else
            If Ctr = 1 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Project2")
            ElseIf Ctr = 2 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Package2")
            ElseIf Ctr = 3 Then
                Set Subject_Slice = wb.SlicerCaches("Slicer_Disc2")
            End If
        End If

        Subject_Slice.ClearAllFilters

        On Error Resume Next
        For Each Sl_Item In Master_Slice.SlicerItems
            If Sl_Item.Selected = True Then
                Subject_Slice.Sl_Item.Selected = True
            Else
                Subject_Slice.Sl_Item.Selected = False
            End If
        Next Sl_Item
        On Error GoTo 0

    Next Ctr2
Next Ctr

TurnStuffOn
End Sub

【问题讨论】:

  • 问得好问题!欢迎来到 SO。是否抛出任何错误?
  • 在主代码上,没有抛出任何错误,只是没有达到目标。在简化版本上,我得到'运行时错误1004应用程序定义或对象定义错误'
  • 你看过我的帖子了吗:jkp-ads.com/Articles/slicers04.asp
  • @jkpieterse 快速浏览了一下,似乎我的应该在此之后工作。除非我错过了什么。我的工作表是这样设置的:最终用户只能看到三个切片器中的一个,另外两个隐藏在其他工作表中。所以我希望我可以设置它,这样他们只需要与 3 个枢轴之一的切片器交互,但会影响所有数据。

标签: excel vba filter pivot-table


【解决方案1】:

只是为了让大家知道,我已经深入了解了。

代码没有任何问题,事实上第一个数据透视表是从数据表中加载的。我删除了枢轴,将其重置,使其直接从 excel 文件中读取,并且工作正常。

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2016-01-07
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多