2017-05-09 21 views
0

私はピボットテーブルを使用して、12か月間にわたって毎月さまざまな人物のデータを並べ替えます。データが生成されるテーブルには、動的な日付範囲があります(つまり、ユーザーはテーブルをカスケードする開始日を指定できます)。ピボット・テーブルとチャートは、データ分析の一部としてこのマスター・テーブルから生成されます。 先月私がこのツールを作成したときにこれは素晴らしいことでしたが、私のコードでは4月からの月に対応するピボットフィールドの名前がハードコードされていました(下記参照)。これにより、5月の開始日からピボットテーブルを実行しようとすると、ピボットテーブルが壊れます。ピボットテーブルの "PivotFields"/dataフィールドを日付範囲に対応させて動的にするにはどうすればよいですか?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

関連する問題