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