2017-10-09 1 views
0

20 개 이상의 탭이있는 Excel 통합 문서가 있습니다.

각 탭에는 하나의 피벗 테이블이 있으며 20 개 이상의 슬라이서가있을 수 있습니다.

워크 시트 "Origin"은 다른 모든 워크 시트와 공유 할 수있는 슬라이서 설정을 가지고 있습니다.

모든 슬라이서를 복사하여 다른 시트의 관련 피벗 테이블에 부착하는 코드를 이미 개발했습니다. 이 과정에서 고유 한 슬라이서 이름이 만들어집니다.

이제 슬라이더의 복사 된 세트가있는 원고를 "원점"으로 사용할 수 있도록이 부분을 확장하려고합니다.

여기 슬라이서의 이름 바꾸기가 현재 모든 slicercache를 반복하면서 문제가 발생합니다. 슬라이서가 속한 워크 시트를 식별 할 수있는 방법이 있습니까?

다음은 슬라이서 정보를 얻는 코드의 일부입니다. 진행중인 작업이므로 약간 지저분합니다.

참고 : SlicerArray는 형식 배열입니다.

"****"이있는 행은 "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 

답변

0

결국 답을 찾았습니다. 워크 시트와 슬라이서 이름을 연결하는 작업은 Pivot 테이블 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