2015-04-20 5 views
0

Я пытаюсь сделать макрос, который делает сводную таблицу. В настоящее время мне удалось найти код, который помог мне его создать, проблема в том, что я не могу найти способ добавить различные PivotFields, используя для поиска или массива, в настоящее время я использую этот код для добавления PivotFields:Добавление нескольких PivotFields в Excel VBA

'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

Предполагая, что все поля шарнирные называются «Sxx», где хх это число, дать этому выстрел:

'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 
+0

Да, они централизованно называются «Sxx», и да, это прекрасно работает, большое спасибо – MoralesJosue

2

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 
+0

Отличная информация! Спасибо. Я закрою эту тему, чтобы изучить этот материал позже. – FreeMan

Смежные вопросы