Как сделать мои сводные поля динамическими в коде 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