识别属于特定工作表的透视表切片器

时间:2017-10-09 14:07:14

标签: excel vba pivot-table slicers

我有一个包含20多个标签的Excel工作簿。

每个标签都有一个数据透视表,可以有20多个切片。

工作表" Origin"切片器设置可以与所有其他工作表共享(稍作修改)
我已经开发了代码,可以复制所有切片器并将它们附加到另一个切片机上床单。在此过程中会创建唯一的切片器名称。

我现在想要扩展它,这样我就可以使用任何一张复制的切片器作为" Origin"。

这里我遇到了问题,因为切片器的重命名目前遍历所有的slicercache。有没有办法识别切片器所属的工作表?

以下是我获取切片器信息的代码的一部分。这有点麻烦,因为这是正在进行的工作!

注意:SlicerArray是一个Type数组。

与" ****& #34;如果我在除了" Origin"之外的任何其他工作表上开始我的流程,会给我带来问题。 (Slicercache中的初始项属于Origin表,因此在从备用工作表处理缓存时找不到这些形状)。如果我可以识别属于该特定工作表的切片器,我可以绕过这个。

Dim slCaches As SlicerCaches
Dim slCache As SlicerCache
Dim SlicerInfo(100, 6)
Dim sh As Shape
Dim IntIndex As Integer
Dim SlicerArray(100) As SlicerRecord
Dim pt As PivotTable
Dim jSlicers As Slicers
Dim kSlicer As Slicer
Dim ws As Worksheet
Dim sh_name As String


For Each pt In ActiveSheet.PivotTables
   For Each slCache In slCaches
      For Each kSlicer In slCache.Slicers
         If kSlicer.Shape.TopLeftCell.Worksheet.Name = ActiveSheet.Name Then
            Set sh = ActiveSheet.Shapes(slCache.SourceName)'*****
             With SlicerArray(IntIndex)
                .PivotTable = pt.Name
                .Name = slCache.Name
                .SourceName = slCache.SourceName
                .Top = sh.Top
                .Left = sh.Left
                .Width = sh.Width
                .Height = sh.Height
                .Caption = kSlicer.Caption
                 With slCache.Slicers(slCache.SourceName)
                      SlicerArray(IntIndex).Columns = .NumberOfColumns
                 End With
                IntIndex = IntIndex + 1
            End With
        End If
    Next kSlicer
  Next slCache
Next pt

2 个答案:

答案 0 :(得分:0)

我最终找到了答案。链接工作表和切片器名称可以通过数据透视表Parent.Name属性完成。我使用下面的代码来填充具有相关切片器名称和相关工作表的另一个类型数组。

IntIndex = 0
For Each slCache In ActiveWorkbook.SlicerCaches
    For Each PT In slCache.PivotTables
        PT.Parent.Activate
        'Debug.Print Slcache.Name & "," & PT.Parent.Name
        With MySlicersSheetArray(IntIndex)
         .StrSlicerName = slCache.Name
         .StrSlicerSourceName = slCache.SourceName
         .strSheetName = PT.Parent.Name
        End With
    Next
    IntIndex = IntIndex + 1
Next
ws.Activate

答案 1 :(得分:0)

使用 kSlicer.name 而不是 slCache.SourceNamekSlicer.name 也是对象 Shape 的名称。