PivotFields
ведет себя странно, потому что это на самом деле объединение нескольких коллекций, один для каждого возможного поля ориентации ,
Из документации:
В некоторых случаях может быть проще использовать одно из свойств, которые возвращает подмножество полей сводной таблицы. Следующие аксессоры методы доступны:
ColumnFields недвижимость
поля данных недвижимости
HiddenFields недвижимость
PageFields недвижимость
RowFields недвижимость
VisibleFields недвижимость
Если вы хотите установить ориентацию в цикле, вы, вероятно, захотите перетащить коллекцию HiddenFields, потому что вы не хотите настраивать поля, которые уже настроены на ориентацию строк или столбцов.
Проблема заключается в том, что после установки ориентации элемента в 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
Вы можете даже сходить с ума и построить всю сводную таблицу из структуры массива.
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
Да, они централизованно называются «Sxx», и да, это прекрасно работает, большое спасибо – MoralesJosue