Макрос Excel VBA для сводной таблицы с динамическим диапазоном данных

КОД РАБОТАЕТ! СПАСИБО ЗА ПОМОЩЬ!

Я пытаюсь создать динамическую сводную таблицу, которая будет работать с данными, которые различаются по количеству строк. В настоящее время у меня 28 300 строк, но это может меняться ежедневно.

Пример следующего формата данных:

Case Number    Branch      Driver
1342           NYC         Bob
4532           PHL         Jim
7391           CIN         John
8251           SAN         John
7211           SAN         Mary
9121           CLE         John
7424           CIN         John

Пример готовой таблицы:

Driver    NYC    PHL   CIN   SAN   CLE
Bob       1      0     0     0     0
Jim       0      1     0     0     0    
John      0      0     2     1     1     
Mary      0      0     0     1     0     

Закодируйте следующим образом:

Sub CreateSummaryReportUsingPivot()
' Use a Pivot Table to create a static summary report
' with model going down the rows and regions across
Dim WSD As Worksheet
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim PRange As Range
Dim FinalRow As Long
Dim FinalCol As Long
Set WSD = Worksheets("PivotTable")

'Name active worksheet as "PivotTable"
 ActiveSheet.Name = "PivotTable"

' Delete any prior pivot tables
For Each PT In WSD.PivotTables
    PT.TableRange2.Clear
Next PT

' Define input area and set up a Pivot Cache
FinalRow = WSD.Cells(Application.Rows.Count, 1).End(xlUp).Row
FinalCol = WSD.Cells(1, Application.Columns.Count). _
    End(xlToLeft).Column
Set PRange = WSD.Cells(1, 1).Resize(FinalRow, FinalCol)
Set PTCache = ActiveWorkbook.PivotCaches.Add(SourceType:= _
    xlDatabase, SourceData:=PRange)

' Create the Pivot Table from the Pivot Cache
Set PT = PTCache.CreatePivotTable(TableDestination:=WSD. _
    Cells(2, FinalCol + 2), TableName:="PivotTable1")

' Turn off updating while building the table
PT.ManualUpdate = True

' Set up the row fields
PT.AddFields RowFields:="Driver", ColumnFields:="Branch"

' Set up the data fields
With PT.PivotFields("Case Number")
    .Orientation = xlDataField
    .Function = xlCount
    .Position = 1
End With

With PT
    .ColumnGrand = False
    .RowGrand = False
    .NullString = "0"
End With

' Calc the pivot table
PT.ManualUpdate = False
PT.ManualUpdate = True

End Sub

person Liquidgenius    schedule 25.09.2012    source источник
comment
Вы говорите, что это выполняется в файле CSV? Каковы шансы, что у вас нет листа с именем PivotTable?   -  person scott    schedule 25.09.2012
comment
Я думал, что Dim WSD as Worksheet, а затем Set WSD = Worksheets (PivotTable) динамически создает рабочий лист с именем PivotTable. Разве это не так?   -  person Liquidgenius    schedule 25.09.2012
comment
Переименование рабочего листа с Sheet1 в PivotTable вручную, а затем запуск макроса позволяет обойти исходную ошибку, поэтому ваше понимание помогло. Теперь я ошибаюсь в разделе, прокомментированном как «Создание сводной таблицы из сводного кэша». Ошибка заключается в том, что метод «CreatePivotTable» объекта «PivotCache» не выполнен.   -  person Liquidgenius    schedule 25.09.2012
comment
Я добавил ActiveSheet.Name = PivotTable после создания экземпляров переменных вверху.   -  person Liquidgenius    schedule 25.09.2012
comment
попробуйте pivotcache.create вместо .add   -  person scott    schedule 25.09.2012
comment
Спасибо, Скотт! Это сделало это. Код теперь работает!!   -  person Liquidgenius    schedule 26.09.2012


Ответы (2)


Любая причина, по которой вы используете VBA, кроме изменения количества строк?

Если вы используете Excel 2007/2010, создайте обычную таблицу/список (Ctrl-L) из исходных данных. Вы также можете дать ему имя. Затем создайте сводную таблицу и используйте имя таблицы в качестве источника данных. По мере добавления строк ваша таблица будет расширяться, и вы сможете просто обновить сводную таблицу (F5 или с помощью VBA).

Если вы работаете в Excel 2003, вы также можете создавать динамические именованные диапазоны. Это немного сложнее (и намного уродливее), но я могу помочь вам с этим, если вы застряли на более старой версии.

person pedram    schedule 25.09.2012
comment
Я использую VBA, потому что это автоматизированный процесс, работающий с файлом cvs, который я ежедневно получаю по электронной почте. Я запускаю макрос из сценария, который запускается правилами электронной почты. Я использую Excel 2011 для Mac. В нем есть VBA 14.0. - person Liquidgenius; 25.09.2012
comment
Если я смогу заставить этот макрос работать, я смогу полностью автоматизировать процесс сбора данных и буду получать ежедневно обновляемую информацию, которая используется в качестве основы для визуальной аналитики в Tableau. - person Liquidgenius; 25.09.2012
comment
Очевидно, но рабочий лист называется именно сводной таблицей? Открывает ли Sheets(PivotTable).Activate лист? - person pedram; 25.09.2012
comment
Короткий ответ: нет. Макрос дает сбой, когда я устанавливаю для WSD имя сводной таблицы. - person Liquidgenius; 25.09.2012
comment
У меня сложилось впечатление об этом коде, что он должен был динамически создавать сводную таблицу рабочего листа, но по какой-то причине это не сработало. - person Liquidgenius; 25.09.2012
comment
Ваше право... рабочий лист нужно вручную переименовать в сводную таблицу. Теперь я ошибаюсь в разделе, прокомментированном как «Создание сводной таблицы из сводного кэша». Ошибка заключается в том, что метод «CreatePivotTable» объекта «PivotCache» не выполнен. - person Liquidgenius; 25.09.2012

Они изменили объектную модель для PivotCaches. Метод, который вам нужен в 2007-2010 годах (который использует версию VBA 7 вместо версии 6),

 PivotCaches.Create
person scott    schedule 28.09.2012