Excel VBA-刷新数据透视缓存

时间:2018-11-22 04:44:22

标签: excel vba excel-vba

最近,我一直在寻找在几个数据透视表之间共享相同数据透视缓存的方法,因为它们都使用相同的数据源。这有助于大幅减少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

当前代码段的问题是:

  1. 仅适用于一个数据源。方案:如果我有12个数据透视表,则6个数据透视表共享数据源1,其他6个数据透视表共享数据源2。除非重复相同的功能,否则此功能将只允许1个数据透视表缓存。

  2. 不会反映数据源上的更新。方案:我执行创建数据透视表缓存和数据透视表的宏。然后,将10条新记录添加到数据源中,并使用相同的宏刷新数据透视表。这10条新记录将不包括在内,因为它仍使用过期的数据透视缓存。

由于枢轴缓存只能创建一次,因此会出现这些问题。创建之后,由于已经创建了数据透视缓存,因此它会“忽略”更改。

可以对GetPivotCache函数进行哪些更改以帮助解决这些问题? Excel如何知道何时创建新的数据透视缓存?我尝试记录创建枢纽表的宏,但没有看到任何看起来像是要检查枢纽缓存是否已经存在以便创建新的枢纽。

0 个答案:

没有答案