在Excel VBA中添加多个数据透视字段

我试图做一个macros,这使得一个数据透视表。 目前我已经能够find一些帮助我创build它的代码,问题是我找不到使用for外观或数组添加各种PivotField的方法,目前我使用这个代码来添加PivotFields:

'set data field - specifically change orientation to a data field and 'set its function property: With PvtTbl.PivotFields("S1") .Orientation = xlDataField .Function = xlSum .NumberFormat = "#,##0" .Position = 1 End With With PvtTbl.PivotFields("S2") .Orientation = xlDataField .Function = xlSum .NumberFormat = "#,##0" .Position = 2 End With 

正如你可以看到我只是重复相同的代码添加另一个领域,有没有更好的方式来添加多个领域,而不是只复制粘贴相同的代码? 我需要添加22个字段。

假设所有的透视字段都被命名为“Sxx”,其中xx是一个数字,给这个镜头:

 'set data field - specifically change orientation to a data field 'and set its function property: Dim I as Integer For I = 1 to 22 With PvtTbl.PivotFields("S" & i) .Orientation = xlDataField .Function = xlSum .NumberFormat = "#,##0" .Position = i End With Next 

PivotFields行为奇怪,因为它实际上是几个集合的联合,每个可能的领域定位一个。

从文档:

在某些情况下,使用其中一个返回数据透视表字段子集的属性可能会更容易一些。 以下访问器方法可用:

ColumnFields属性

DataFields属性

HiddenFields属性

PageFields属性

RowFields属性

VisibleFields属性

如果要将方向设置为循环,则可能需要遍历HiddenField集合,因为您不希望调整已设置为行或列方向的字段。

问题是,一旦你在HiddenFields中设置了一个元素的方向,它不再被隐藏,所以它被从集合中移除。 这意味着一个正常的循环将无法正常工作,除非你使for循环回退。 如果你使用这样的Do循环,我认为它更清晰。

 Dim pf As PivotField Do Until PvtTable.HiddenFields.Count = 0 Set pf = PvtTbl.HiddenFields(1) pf.Orientation = xlDataField pf.Function = xlSum pf.NumberFormat = "#,##0" Loop 

如果您遇到了想要设置为数据定向的字段列表,但没有命名约定的情况,则可以这样做。

 Dim i As Long Dim data_fields As Variant data_fields = Array("Units", "Cost", "Mileage", "Whatever") For i = 0 To UBound(data_fields) Set pf = PvtTbl.PivotFields(data_fields(i)) pf.Orientation = xlDataField ' ... etc. Next 

你甚至可以坚持从数组结构中构build整个数据透视表。

 Dim i As Long Dim pf As PivotField Dim pt_layout As Variant ' Tuple format: ' Field name, Orientation, Position, Function, Number format ' (Function and Number format are only used by data fields.) pt_layout = Array( _ Array("Client", xlRowField, 1, Empty, Empty), _ Array("Year/Month", xlColumnField, 1, Empty, Empty), _ Array("Units", xlDataField, 1, xlSum, "0"), _ Array("Cost", xlDataField, 2, xlAverage, "#,##0"), _ Array("Whatever", xlDataField, 3, xlCount, "General")) For i = 0 To UBound(pt_layout) Set pf = PvtTbl.PivotFields(pt_layout(i)(0)) pf.Orientation = pt_layout(i)(1) pf.Position = pt_layout(i)(2) If pf.Orientation = xlDataField Then pf.Function = pt_layout(i)(3) pf.NumberFormat = pt_layout(i)(4) End If Next