0

20 個以上のタブがある Excel ブックがあります。

各タブには 1 つのピボット テーブルがあり、20 以上のスライサーを使用できます。ワークシート「Origin」には、すべてのスライサーをコピーして他のシートの関連するピボットテーブルにアタッチするコードを既に開発し

た他のすべてのワークシートと (わずかな変更を加えて) 共有できるスライサーが設定されています。

このプロセス中に、一意のスライサー名が作成されます。

これを拡張して、コピーされたスライサーのセットを含むシートを「オリジン」として使用できるようにします。

ここで、スライサーの名前を変更すると、現在すべてのスライサーキャッシュをループしているため、問題が発生します。スライサーが属するワークシートを識別する手段はありますか?

以下は、スライサー情報を取得するコードの一部です。これ'

注: SlicerArray は Type 配列です。

「オリジン」以外のシートでプロセスを開始すると、「****」の行が問題を引き起こします。(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
4

2 に答える 2

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
于 2017-10-12T15:21:05.553 に答える