通过VBA更新数据透视表的DataSource,而不创build新的PivotCaches

我有一个工作簿,其中有一个RawData表,并且有其他8到9张其他工作表具有从RawData读取表的数据透视表。 RawData每天都在变化,即RawData表格的表格中可能有更多或更less的行数。

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

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

但是这个代码所做的是为每个数据透视表创build了新的透视caching,并增加了文件的大小。 但是,我不希望文件大小或数量的透视caching增加,但只是改变现有的数据透视表/数据透视表的数据源,并刷新它们。

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

从此,无论您何时将新数据放入RawData,表格将自动展开(或收缩)以适应该表格,并且无论何时单击刷新,数据透视表都将自动引用这些表格而不是硬编码的范围。

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

您应该考虑使用dynamic命名范围来定义您的RawData。 将所有数据透视表的数据源设置为您的dynamic命名范围,然后单击data> refresh all来更新所有数据透视表

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

为所有PivotTable 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