2014-12-04 3 views
3

Я пытаюсь динамически обновлять некоторые сводные таблицы в Excel. Сводные таблицы (и подключенные слайсеры - каждый слайсер подключается к нескольким опорным точкам) уже существуют, в таблице исходных данных нет. Процесс следующим образом:Неверный вызов процедуры или аргумент - попытка динамического изменения сводного кеша

  • Создать новую таблицу для хранения необработанных данные
  • Заполнить листа, обернуть данные в ListObject (таблицу)
  • Создать новый кэш поворота из новых данных
  • Unlink в ломтерезки из сводных таблиц
  • Изменение кэш-памяти сводных таблиц на новый кэш
  • Обновить поворотные столы
  • Ссылка на ломтерезки назад вверх
  • Удалить данные листа

Чтобы уточнить структуру: исходную таблицу Один данных. Несколько сводных таблиц, указывающих на источник. Несколько ломтерезки, каждый из которых соединен со всеми сводными таблицами (например, неделя Окончание ломтерезки chages неделя Окончание на всех шарнирах)

Я бегу в проблему, однако с шага 4. Следующий код работает:

'dataTable is a ListObject that was created on a sheet earlier in the function. Can confirm 100% that it exists and is populated.  
Dim pt As PivotTable 
For Each pt in PivotSheet.PivotTables 
    pt.ChangePivotCache ThisWorkbook.PivotCaches.Create(_ 
     SourceType:=xlDatabase, _ 
     SourceData:=dataTable) 
Next pt 

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

Я решил, что путь к созданию будет заключаться в создании единого сводного кеша, а затем привязать каждую сводную таблицу к нему. Этот код, однако, не работает, выбрасывая error 5 у меня в первый раз, когда он достиг:

'dataTable is a ListObject that was created on a sheet earlier in the function. Can confirm 100% that it exists and is populated. 
Dim pc As PivotCache 
Set pc = ThisWorkbook.PivotCaches.Create(_ 
    SourceType:=xlDatabase, _ 
    SourceData:=dataTable) 

Dim pt As PivotTable 
For Each pt in PivotSheet.PivotTables 
    pt.ChangePivotCache pc 'Invalid Procedure Call Or Argument 
Next pt 

Что я делаю неправильно здесь?

ответ

1

Объединить два подхода:

Dim bCreated    As Boolean 
Dim lngMasterIndex  As Long 
Dim pt     As PivotTable 

For Each pt In PivotSheet.PivotTables 
    If Not bCreated Then 

     pt.ChangePivotCache ThisWorkbook.PivotCaches.Create(_ 
          SourceType:=xlDatabase, _ 
          SourceData:=DataTable) 
     bCreated = True 
     lngMasterIndex = pt.CacheIndex 
    Else 
     pt.CacheIndex = lngMasterIndex 
    End If 
Next pt 
+0

Да, это сделал , На самом деле, к настоящему времени следует ожидать, что все, что кажется простым в VBA, будет состоять из 10 дополнительных строк объявлений с переменными переменными, отслеживания состояния и блока If-Else. Ура! – Kai

0

Если вы ненавидите снорклинга код, чтобы заставить его работать, это короткий и грязный способ сделать это:

For Each pt in PivotSheet.PivotTables 
    On Error Resume Next 
    pt.ChangePivotCache pc 'works for the first entry 
    pt.CacheIndex = pc.Index 'works for all the others 
    On Error GoTo 0 
Next PT 
Смежные вопросы