最近,我一直在寻找在几个数据透视表之间共享相同数据透视缓存的方法,因为它们都使用相同的数据源。这有助于大幅减少excel文件的大小,因为对于每个数据透视表创建相同数据的新数据透视表缓存效率低下。
提供给我的一种解决方案是使用静态变量,该变量允许创建单个数据透视表缓存,该缓存可由不同的子例程共享。就是这样。
'creates and returns a shared pivotcache object
Function GetPivotCache(pRange As Range) As PivotCache
Static pc As PivotCache 'static variables retain their value between calls
If pc Is Nothing Then 'create if not yet created
Set pc = ActiveWorkbook.PivotCaches.Create _
(SourceType:=xlDatabase, SourceData:=pRange)
End If
Set GetPivotCache = pc
End Function
此功能用于在子例程之间创建共享数据透视缓存。创建数据透视表时,我调用此函数来检查是否已创建数据透视表缓存。如果有,它将不会创建数据透视表缓存的新副本,并且将返回已经存储在静态变量中的副本。
如果有人想知道我在创建数据透视表时如何使用它,我将提供更多代码以更好地了解其使用方式。
Sub pivottable1()
Dim PSheet As Worksheet, DSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PField As PivotField
Dim pRange As Range
Dim LastRow As Long
Dim LastCol As Long
Dim PvtTable As PivotTable
Dim SheetName As String
Dim PTName As String
SheetName = "MySheetName1"
PTName = "PivotTable1"
On Error Resume Next
Application.DisplayAlerts = False
Worksheets(SheetName).Delete
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = SheetName
Application.DisplayAlerts = True
Set PSheet = Worksheets(SheetName)
Set DSheet = Worksheets(1)
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
Set pRange = DSheet.Cells(1, 1).Resize(LastRow, LastCol)
Set PCache = GetPivotCache(pRange) 'Here is where I call the function
Set PTable = PCache.CreatePivotTable _
(TableDestination:=PSheet.Cells(1, 1), TABLENAME:=PTName)
Sheets(SheetName).Select
Set PvtTable = ActiveSheet.PivotTables(PTName)
'Rows
With PvtTable.PivotFields("TypeCol")
.Orientation = xlRowField
.Position = 1
End With
With PvtTable.PivotFields("NameCol")
.Orientation = xlRowField
.Position = 2
End With
'Columns
With PvtTable.PivotFields("CategoryCol")
.Orientation = xlColumnField
.Position = 1
End With
'Values
PvtTable.AddDataField PvtTable.PivotFields("Values1"), "Value Balance", xlSum
PvtTable.AddDataField PvtTable.PivotFields("Values2"), "Value 2 Count", xlCount
End Sub
当前代码段的问题是:
仅适用于一个数据源。方案:如果我有12个数据透视表,则6个数据透视表共享数据源1,其他6个数据透视表共享数据源2。除非重复相同的功能,否则此功能将只允许1个数据透视表缓存。
不会反映数据源上的更新。方案:我执行创建数据透视表缓存和数据透视表的宏。然后,将10条新记录添加到数据源中,并使用相同的宏刷新数据透视表。这10条新记录将不包括在内,因为它仍使用过期的数据透视缓存。
由于枢轴缓存只能创建一次,因此会出现这些问题。创建之后,由于已经创建了数据透视缓存,因此它会“忽略”更改。
可以对GetPivotCache函数进行哪些更改以帮助解决这些问题? Excel如何知道何时创建新的数据透视缓存?我尝试记录创建枢纽表的宏,但没有看到任何看起来像是要检查枢纽缓存是否已经存在以便创建新的枢纽。