在Excel VBA中添加多个PivotField

时间:2015-04-20 20:25:24

标签: excel vba excel-vba

我正在尝试创建一个构成数据透视表的宏。目前我已经能够找到一些帮助我创建它的代码,问题是我找不到使用for look或数组添加各种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个字段。

2 个答案:

答案 0 :(得分:2)

假设您的所有数据透视字段都被命名为“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

答案 1 :(得分:2)

PivotFields行为奇怪,因为它实际上是几个集合的联合,每个集合对应一个可能的字段方向。

来自文档:

  

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

     

ColumnFields属性

     

DataFields属性

     

HiddenFields属性

     

PageFields属性

     

RowFields属性

     

VisibleFields属性

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

问题是,一旦你在HiddenFields中设置了一个元素的方向,它就不再被隐藏了,所以它会从集合中删除。这意味着正常的for循环将不起作用,除非你使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

你甚至可以疯狂地从数组结构构建整个数据透视表。

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