Почему мой код не выдает правильную сводную таблицу? - PullRequest
2 голосов
/ 26 июня 2019

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

Я передаю правильные аргументы, и он не возвращает никакой ошибки. Фактически он создает пустую сводную таблицу, но не заполняет данные (RowFields).

Поскольку есть много строк кода, я собираюсь показать только проблемную часть. (Пожалуйста, дайте мне знать, если вам нужно больше кода, чтобы ответить на мой вопрос)

'This is the portion adding RowField, and this works, but it is hard coded. Too much of repetitive code!
With ActiveSheet.PivotTables("MyPivot").PivotFields("ColumnName1")
    .Orientation = xlRowField
    .Position = 1
End With
With ActiveSheet.PivotTables("MyPivot").PivotFields("ColumnName2")
    .Orientation = xlRowField
    .Position = 2
End With
With ActiveSheet.PivotTables("MyPivot").PivotFields("ColumnName3")
    .Orientation = xlRowField
    .Position = 3
End With

'And this is the rewritten code with loop, but it does not add any data to the pivot table.
'Argument1: ArrayRowField - a string array containing "Column1", "Column2", and "Column3"
'Argument2: PivotTableName - a string containing "MyPivot"
Dim counter As Integer
For counter = 0 To UBound(ArrayRowField)
    With ActiveSheet.PivotTable(PivotTableName).PivotField(ArrayRowField(counter))
        .Orientation = xlRowField
        .Position = (counter + 1)
    End With
Next counter

Мне кажется, что эти двое должны вести себя одинаково. Но работает только верхний, добавляя поля строк к ориентации, а нижний - нет. Может кто-нибудь сказать мне, что я делаю не так?

Редактировать: Я только что попытался вывести оператор with за пределы цикла, но это не имело никакого значения.

'This did nothing to fix my problem
Dim counter As Integer
With ActiveSheet.PivotTable(PivotTableName).PivotField(ArrayRowField(counter))
    For counter = 0 To UBound(ArrayRowField)
        .Orientation = xlRowField
        .Position = (counter + 1)
    Next counter
End With

1 Ответ

3 голосов
/ 26 июня 2019

Имеет "s" (два)

With ActiveSheet.PivotTables("MyPivot").PivotFields("ColumnName2")
                           ^                      ^

пропущено два "s"

With ActiveSheet.PivotTable(PivotTableName).PivotField(ArrayRowField(counter))
...