【问题标题】:hide sheet rows based on slicer selection根据切片器选择隐藏工作表行
【发布时间】:2018-09-15 17:46:06
【问题描述】:

如果选择了切片器中的某个值,有什么方法可以隐藏某些行? 我有一些图只有在选择了一个特定的链时才需要显示,如果没有选择 - 然后隐藏图(位于第 287:345 行)。 我尝试了以下操作,但没有成功:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If ActiveWorkbook.SlicerCaches("Slicer_Chain").SlicerItems("ChainName").Selected = True Then
        Rows("287:346").Hidden = False
    Else
        Rows("287:346").Hidden = True
    End If

End Sub

【问题讨论】:

  • 你会想要 EntireRow.Hidden = True 对于初学者我认为。而且我通常针对与切片器关联的数据透视表,但也许这只是我,即关联的数据透视表更新事件。
  • 另外,不要硬编码行号,而是在 Excel 中分配一个命名范围并在代码中引用该命名范围。否则,您需要在插入/删除行时随时调整 VBA 代码。

标签: vba excel pivot-table slicers


【解决方案1】:

我将针对与切片器关联的数据透视表的 Worksheet_PivotTableUpdate 事件。

地点:

在包含与切片器关联的数据透视表的工作表的代码窗格中。

类似如下:

注意:

  1. 根据需要更改数据透视表名称
  2. 如果要隐藏的行在不同的工作表中,请在行之前添加工作表名称,例如

    ThisWorkbook.Worksheets("Sheet1").Rows("287:346").EntireRow.Hidden = False
    

代码:

Option Explicit

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

    If Target.Name <> "PivotTable1" Then
        Exit Sub
    Else
       If Parent.SlicerCaches("Slicer_Chain").SlicerItems("ChainName").Selected Then
        Rows("287:346").EntireRow.Hidden = False
       Else
        Rows("287:346").EntireRow.Hidden = True
       End If
    End If

End Sub

【讨论】:

  • 好答案。请注意,很多事情都会触发数据透视表更新事件,正如我在dailydoseofexcel.com/archives/2014/07/08/… 的帖子中所述,如果需要,您可以检查撤消堆栈并查看更新是否由切片器操作引起。通常在使用 PivotTable_Update 事件时,我会创建一个仅包含感兴趣字段的“从属”数据透视表,并将其链接到“主”数据透视表。然后我用一个隐藏的切片器将它们连接起来,并使用来自从站的更新事件。这让我只能收集由该字段触发的更新事件。
  • @jeffreyweir 告诉我更多......我对这些事情知之甚少。明天我会看看那个参考资料。同时我应该对上述内容进行编辑以改进它吗?可能会使通话更便宜的东西.....
  • 您的回答很好……我的评论仅用于提供信息,以防有人正在寻找一种仅在 特定 PivotField 为改变了。 :-)
  • 如果目标工作表包含具有相同PivotCache的其他PivotTables,则目标行的hidden属性将重复更新。为避免将PivotTable 名称的验证和PivotItem 选择的验证分开,请将此行:If Target.Name = "PivotTable1" And Parent.SlicerCaches("Slicer_Chain").SlicerItems("ChainName").Selected Then 替换为这两行:If Target.Name &lt;&gt; "PivotTable1" then Exit SubIf Parent.SlicerCaches("Slicer_Chain").SlicerItems("ChainName").Selected Then
  • @QHarr 出于某种原因,这对我来说是一个错误,可能是因为我的表格在一张纸上,而切片器和绘图在另一张纸上,我没有正确引用它们。 . 但是感谢您提及代码位置和添加工作表参考!
【解决方案2】:

要求:根据SlicerItemSelected 状态显示\隐藏Range 行。

VBA 程序: (根据 OP 方法)

尝试以下过程(参见过程中的 cmets\explanation)

    Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    Dim sc As SlicerCache, sl As Slicer
    Dim sPt As String, sFld As String, sItm As String, sRng As String

    'Use variables to hold the criteria to be applied
        sPt = "PivotTable1"
        sFld = "Chain"
        sItm = "A.6"
        sRng = "287:346"

        With Target

            Rem Validate PivotTable
            If .Name <> sPt Then Exit Sub

    ' As Slicer names can be easily changed by users, need to identify
    ' the SlicerCache connected to the target `PivotTable` using the 
    ' SourceName of the PivotField. This step returns the SlicerCache 
    ' connected to the PivotTable otherwise, the SlicerCache is nothing.
            Rem Set SlicerCache
            For Each sl In .Slicers
                If sl.SlicerCache.SourceName = sFld Then
                    Set sc = sl.SlicerCache
                    Exit For
        End If: Next: End With

        Rem Validate SlicerItem & Apply Result
        If Not (sc Is Nothing) Then

    ' This line Shows\Hides the target range based on the opposite 
    ' status of the target SlicerItem.
            Me.Rows(sRng).EntireRow.Hidden = Not (sc.SlicerItems(sItm).Selected)

        Else

    ' PivotTable is not connected to a Slicer of the target PivotField
            MsgBox "PivotTable [" & sPt & "]" & String(2, vbLf) & _
                vbTab & "is not connected to Slicer of Field [" & sFld & "].", _
                vbApplicationModal + vbInformation, "Slicers Selection"

        End If

        End Sub

另一种方法:

请记住,SlicerPivotTables 的一种远程控制,可以双向工作,即Slicer 更新PivotTablesPivotTables 更新Slicer,如这样就不需要验证PivotTable是否被Slicer操作更新了,只需要检查目标PivotItem中目标PivotItemVisible属性,不管Slicer是否和PivotTable 是否连接。

此过程仅使用目标 PivotTable,即显示或隐藏目标范围,具体取决于 PivotItem 在数据透视表中是否可见。

    Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    Dim sPt As String, sFld As String, sItm As String, sRng As String

        sPt = "PivotTable1"
        sFld = "Chain"
        sItm = "A.6"
        sRng = "287:346"

        With Target

            Rem Validate PivotTable
            If .Name <> sPt Then Exit Sub

            Rem Validate PivotItem & Apply Result
            With .PivotFields(sFld).PivotItems(sItm)
                Me.Rows(sRng).EntireRow.Hidden = Not (.Visible)

        End With: End With

        End Sub

【讨论】:

  • 第二种方法对我来说非常有效,特别是当我添加了一些工作表引用和条件检查是否在可透视过滤器中只选择了一个项目时(事实证明,如果特定链,我只想要那些图是唯一选择的项目)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多