2017-05-09 9 views
0

12 개월 동안 매월 다양한 사람들을 대상으로 데이터를 정렬하는 피벗 테이블이 있습니다. 데이터가 생성 된 테이블에는 동적 날짜 범위가 있습니다 (즉, 사용자가 테이블을 통해 연속적으로 시작 날짜를 지정할 수 있음). 피벗 테이블 및 차트는 데이터 분석의 일부로이 마스터 테이블에서 생성됩니다. 지난 달이 도구를 만들었을 때 환상적인 일을했지만, 코드에서 하드 코딩 된 피벗 필드의 이름이 4 월의 달과 일치한다는 것을 깨달았습니다 (아래 참조). 5 월에 시작일부터 실행하려고하면 피벗 테이블이 끊어집니다. 피벗 테이블의 '피벗 필드'/ 데이터 입력란을 날짜 범위와 일치하도록 동적으로 만들려면 어떻게해야합니까?VBA 코드에서 내 피벗 필드를 동적으로 만드는 방법

관련 코드는 아래에서 찾을 수 있습니다. 예상대로 오류는 다음에서 발생합니다.

"Compare individuals").PivotFields("Apr-17"), "Sum of Apr-17", xlSum 
ActiveSheet.PivotTables("Compare individuals").AddDataField 

5 월부터 내 피벗 차트/보고서를 실행하려고 할 때.

정말 감사합니다!

Option Explicit 
Sub CreatePivot() 
Dim pt   As PivotTable 
Dim pf   As PivotField 
Dim pi   As PivotItem 
Dim pc   As PivotCache 

    With ActiveWorkbook 
    For Each pc In .PivotCaches 
     pc.MissingItemsLimit = xlMissingItemsNone 
    Next pc 
    End With 


    'Generate base pivot chart 
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ 
     "Indy", Version:=xlPivotTableVersion10). _ 
     CreatePivotTable TableDestination:="'PivotSheet'!R8C6", TableName:="Compare individuals" _ 
     , DefaultVersion:=xlPivotTableVersion10 

    Worksheets("PivotSheet").Activate 
    'Set Name and disc as field and filter respectively 
    With ActiveSheet.PivotTables("Compare individuals").PivotFields("Name") 
     .Orientation = xlRowField 
     .Position = 1 
    End With 
    With ActiveSheet.PivotTables("Compare individuals").PivotFields("Disc ") 
     .Orientation = xlPageField 
     .Position = 1 
    End With 

    'Add data; sums of each month per individual 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Apr-17"), "Sum of Apr-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("May-17"), "Sum of May-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Jun-17"), "Sum of Jun-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Jul-17"), "Sum of Jul-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Aug-17"), "Sum of Aug-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Sep-17"), "Sum of Sep-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Oct-17"), "Sum of Oct-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Nov-17"), "Sum of Nov-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Dec-17"), "Sum of Dec-17", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Jan-18"), "Sum of Jan-18", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Feb-18"), "Sum of Feb-18", xlSum 
    ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
     "Compare individuals").PivotFields("Mar-18"), "Sum of Mar-18", xlSum 
    ActiveSheet.PivotTables("Compare individuals").PivotFields("Disc ").CurrentPage = _ 
     "(All)" 
'Set data in columns 
    With ActiveSheet.PivotTables("Compare individuals").DataPivotField 
     .Orientation = xlColumnField 
     .Position = 1 
    End With 

EDIT : 조금 더 많은 컨텍스트. 내 피벗 테이블은 다음과 같습니다 Pivot

실제 데이터 테이블에 "4 월 17"가 없기 때문에 오류가 표면 상으로 나타

내 소스 데이터는 다음과 같습니다 Source

에있어서, 월/날짜 범위는 동적입니다 (초기 입력부터). Desired

즉 상관없이 호출 무엇의 테이블에 모든 날짜 열을 넣어 : 내가 할 수있는 코드를 원하는 것은

이입니다.

+0

시도주고, 데이터의 샘플은, 당신이 원하는 것을 달성하는 방법에 대한 이해를 수 –

+0

@ShaiRado OP –

답변

0

A.Doe @, 당신이 당신의 피벗 테이블 구조를 공유하시기 바랍니다 수 있다면 이것은

Dim f1 As PivotField 
For Each f1 In ActiveSheet.PivotTables("Compare individuals").PivotFields 
    'MsgBox f1.Name test code 
    If (InStr(f1.Name, "17") > 0) Then 'or some valid condition 
     ActiveSheet.PivotTables("Compare individuals").AddDataField ActiveSheet.PivotTables(_ 
      "Compare individuals").PivotFields(f1.Name), "Sum of " & f1.Name, xlSum 
    End If 
Next 
+0

을 참조하십시오.이 방법을 확인할 수 있습니다. 감사! –

+0

당신은 환영합니다 :) – user2648008