通过VBA更新数据透视表的数据源,而无需创建新的数据透视表

时间:2016-05-05 07:48:28

标签: excel vba pivot-table

我有一个工作簿,其中有一个RawData工作表,还有8-9个其他工作表,它们具有从RawData读取表的数据透视表。 RawData每天都在变化,即RawData表格中可以有更多或更少的行数。

现在,我使用Excel的ChangeDataSource功能手动更新每个工作表的每个数据透视表的DataSource属性。然而,这很痛苦。在网上爬行我发现vba代码一次更新所有数据透视表。我没有粘贴整个代码,但它看起来像这样。

ActiveSheet.PivotTables("PivotTable1").ChangePivotCache ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=<RawData-AddressRange>)

但是这段代码的作用是,它为每个数据透视表创建了新的数据透视缓存,并增加了文件的大小。但是,我不希望文件大小或数据透视缓存的数量增加,而只是更改现有数据透视表/数据透视表的数据源并刷新它们。

3 个答案:

答案 0 :(得分:1)

只需将RawData转换为Excel表格(Ctrl + T是键盘快捷键),然后将数据透视表指向该表格。 (您将不得不再次使用“更改数据源”按钮,以使其从使用硬编码引用(如$ A $ 1:$ Z $ 1000)更改为Table引用(如Table1)。

从那时起,无论何时将新数据放入RawData,Table都会自动扩展(或收缩)以适应它,并且每当您单击刷新时,数据透视表将自动引用这些表而不是硬编码范围。

另请注意,如果数据透视表都基于完全相同的数据源,则刷新其中一个数据源会刷新所有数据源。

答案 1 :(得分:0)

您应该考虑使用动态命名范围来定义RawData。将所有数据透视表的数据源设置为动态命名范围,然后您需要做的就是单击数据&gt;全部刷新以更新所有数据透视表

这是一个关于动态命名范围的教程 http://www.excel-easy.com/examples/dynamic-named-range.html

答案 2 :(得分:0)

为所有PivotCache设置一个PivotTable

Sub UpdatePivots()
  Dim ws As Worksheet, pivot As PivotTable, cache As PivotCache

  ' create a new pivot cache '
  Set cache = ThisWorkbook.PivotCaches.Create( _
      XlPivotTableSourceType.xlDatabase, _
      ThisWorkbook.Sheets("Sheet1").UsedRange)

  ' set the pivot cache for each pivot table
  For Each ws In ThisWorkbook.Worksheets
    For Each pivot In ws.PivotTables
      If cache.Index Then
        pivot.CacheIndex = cache.Index
      Else
        pivot.ChangePivotCache cache
      End If
    Next
  Next

  ' refresh the cache
  cache.Refresh
End Sub