Как сделать мои сводные поля динамическими в коде VBA

У меня есть сводная таблица, которая сортирует данные для разных людей за каждый месяц в течение 12-месячного периода. Таблица, из которой создаются данные, имеет динамический диапазон дат (т. Е. Пользователь может указать дату начала, которая будет каскадно проходить через таблицу). Сводная таблица и диаграмма генерируются из этой основной таблицы как часть анализа данных. Это сработало фантастически в прошлом месяце, когда я создал этот инструмент, однако я понял, что в своем коде у меня есть жестко запрограммированные имена полей сводки, которые соответствуют месяцам с апреля (см. Ниже). Это заставляет мою сводную таблицу разрываться, когда я пытаюсь запустить ее с даты начала мая. Как сделать поля "Сводные поля"/ данных в сводной таблице динамическими, чтобы они соответствовали диапазону дат?

Соответствующий фрагмент кода найден ниже. Как и следовало ожидать, ошибка происходит в:

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

При попытке запустить мой сводный график / отчет за май.

Действительно ценю любые указатели!

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

РЕДАКТИРОВАТЬ: немного больше контекста. Моя сводная таблица выглядит так: стержень

Якобы появляется ошибка, потому что в таблице фактических данных нет "17 апреля"

Мои исходные данные выглядят так: Источник

При этом диапазон месяцев / дат является динамическим (от первоначального ввода).

То, что я хочу, чтобы код сделал это: Желаемый

Т.е. положить все столбцы даты в таблицу независимо от того, как они называются.

1 ответ

Решение

@A.До, попробуй

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
Другие вопросы по тегам