如何在 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
我有一个数据透视表 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