将数据透视表caching从一个文件的透视转移到另一个透视上?

我需要安全地将Excel文件中的数据透视表的caching转换为不同文件的数据透视表。 我怎样才能做到这一点?


这是我现在使用的代码(请注意,即使源数据源已被删除,该方法仍然有效):

Public Sub TransferPivotCache(Source As PivotTable, Target As PivotTable) Dim TempSheet As Worksheet Set TempSheet = ThisWorkbook.Sheets.Add Source.TableRange2.Copy Destination:=TempSheet.Range("A1") Target.CacheIndex = TempSheet.PivotTables(1).CacheIndex TempSheet.Delete End Sub 

然而,当我导入的关键是太大,我修改caching索引属性时,得到错误“没有足够的内存”。 然后,即使文件closures,如果我试图重新打开它,它已经损坏。 是否有更好的方法来在数据透视表之间传输透视caching?

在这里输入图像说明

如果您的目标是更新另一个针对相同数据的数据透视表,那么另一种方法是创build一个指向同一个数据源的新的PivotCache 。 这样,目标工作簿将生成相同的PivotCache而无需复制DataTable ,这可能是您的内存问题的原因。

 Public Sub TransferPivotCache(source As PivotTable, target As PivotTable) Dim pivCache As PivotCache, sh As Worksheet, rgData As Range, refData ' convert the `SourceData` from `xlR1C1` to `xlA1` ' source.Parent.Activate refData = Application.ConvertFormula(source.SourceData, xlR1C1, xlA1, xlAbsolute) If IsError(refData) Then refData = source.SourceData If Not IsError(source.Parent.Evaluate(refData)) Then ' create a new pivot cache from the data source if it exists ' Set rgData = source.Parent.Evaluate(refData) If Not rgData.ListObject Is Nothing Then Set rgData = rgData.ListObject.Range Set pivCache = target.Parent.Parent.PivotCaches.Create( _ XlPivotTableSourceType.xlDatabase, _ rgData.Address(external:=True)) pivCache.EnableRefresh = False target.ChangePivotCache pivCache Else ' copy the pivot cache since the data source no longer exists ' Set sh = source.Parent.Parent.Sheets.Add source.PivotCache.CreatePivotTable sh.Cells(1, 1) sh.Move after:=target.Parent ' moves the temp sheet to targeted workbook ' ' replace the pivot cache ' target.PivotCache.EnableRefresh = True target.CacheIndex = target.Parent.Next.PivotTables(1).CacheIndex target.PivotCache.EnableRefresh = False 'remove the temp sheet ' target.Parent.Next.Delete End If End Sub 

我无法重现与我的Excel专业2010年的资源问题…但你有没有尝试过这种更简单的可能性?

 Public Sub TransferPivotCache(SourcePivot As PivotTable, TargetPivot As PivotTable) TargetPivot.CacheIndex = SourcePivot.CacheIndex End Sub 

它看起来像是一样的(至less在同一个工作簿中),它避免了创build一个全新的工作表。