2017-05-09 83 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 

编辑:多一点上下文。 我的数据透视表看起来是这样的: Pivot

错误表面上显示出来,因为在实际的数据表有没有“APR-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

相关问题