如何在 vba 代码中使我的数据透视字段动态化

How to make my pivot fields dynamic in vba code

我有一个数据透视表 table 可以对 12 个月内每个月不同人的数据进行排序。生成数据的 table 具有动态日期范围(即用户可以指定开始日期,该日期将通过 table 级联)。作为数据分析的一部分,数据透视表 table 和图表是从此主数据 table 生成的。 上个月我创建这个工具时效果非常好,但是我在我的代码中意识到我有硬编码的数据透视字段的名称,以对应于从 4 月开始的月份(请参见下文)。当我尝试从 5 月的开始日期 运行 时,这会使我的枢轴 table 中断。如何使数据透视表 table 中的 "PivotFields"/数据字段动态对应于日期范围?

下面找到了相关的代码片段。正如人们所预料的那样,错误发生在:

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

尝试 运行 我的支点 chart/report 从 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

编辑:更多上下文。 我的数据透视表如下所示:

表面上显示错误是因为实际数据 table

中没有 "Apr-17"

我的源数据如下所示:

其中 months/date 范围是动态的(来自初始输入)。

我想要代码做的是:

即将所有日期列放入 table,不管它们叫什么。

@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