有没有办法检查数据透视缓存是否需要刷新?

时间:2017-04-04 10:35:09

标签: excel excel-vba excel-2010 pivot-table vba

修改

Shai - 谢谢你的回答。但是,它并不适用于我的目的。我创建了一些虚拟数据和数据透视表,然后更改了一些基础数据,您的代码仍然表示缓存与数据相同。我认为这是因为您正在寻找整体范围的变化,而不是范围内的变化。

我一直在玩和使用文档,尤其是您在下面使用的PivotCache.SourceData成员,我不认为可以做我想做的事情。我发现最好的是从原始源数据创建一个新的数据透视缓存,然后以某种方式比较它们(虽然这不可能使用直接相等:

Sub checkCache()

Dim ptTbl As PivotTable, pvtCache As PivotCache

Set ptTbl = Sheets("Sheet2").PivotTables("PivotTable2")
Set pvtCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, ptTbl.PivotCache.SourceData)

If pvtCache = ptTbl.PivotCache Then 'error on this line, cannot compare two pivot caches like this
    MsgBox "True"
Else
    MsgBox "False"
End If

End Sub

如果有更多好主意,我会暂时搁置这个问题几天。

简短版

当需要更改数据透视表的基础数据并且需要刷新数据透视缓存时,我需要向用户强调。由于性能问题,我无法在每次互动时刷新数据透视表。

目前,我使用IF公式执行此操作,该公式检查数据透视表总数是否仍等于工作表总数,但这对非数字数据不起作用。还有更好的方法吗?

长版

我有几千行数据,如下所示(即可以更改的几个类别和数字)。

Name    Category 1  Category 2  Number       Number 2    Category 3...    etc.
Angela      A           X           123
Bob         A           Y           442
Bob         A           Y           566
Charlie     B           X           1445
Angela      A           X           5641231
Dave        B           Y           435
Dave        B           Y           45645
Charlie     B           X           567

我的问题是,当数据透视表需要刷新时(即源数据与数据透视缓存不同时),我想强调团队(和我自己)。

工作簿很大,需要很长时间才能计算,所以每次用户与工作表交互时,我都不想自动刷新数据透视表。这是一份标准的公司工作手册,尽管我已经做了一些改进以加快速度,但我无法做出大规模的改变。

我知道我可以使用会自动更新的SUMIF等来构建汇总表,但在这种情况下我无法做到这一点。

目前,我只是将IF语句与一些明亮的红色条件格式组合在一起,

=IF(total from summing up workbook directly = pivot table total, "Pivot table OK", "Pivot table needs refreshing")

因此用户将看到一个明亮的红色单元格,告诉他们刷新数据透视表。

我遇到的问题是这只适用于数字数据。如果对非数字数据进行了更改,则数据透视表将需要刷新,但这种方法无法正常工作。

我可以设置许多不同的表来计算每个类别中每个标签的出现次数,然后针对从数据透视缓存计算的某些数据透视表进行检查,但这将是很多工作。这可以在Excel或VBA中以另一种方式完成吗?

1 个答案:

答案 0 :(得分:0)

您可以将当前PivotTable.PivotCache.SourceData与工作表中的数据(占据数据透视表)进行比较。

如果String值相同,则无需更新PivotCache,然后刷新PivotTable。如果值不相同,则表示数据结构已更改(添加/删除了更多行和列),您需要更新PivotCacheRefresh PivotTable

<强>代码

Option Explicit

Sub CheckPivotCacheRefresh()

Dim PvtSht          As Worksheet
Dim DataSht         As Worksheet

Dim PTTbl           As PivotTable
Dim SrcData         As String
Dim LastRow         As Long
Dim LastCol         As Long

Set DataSht = Worksheets("Sheet1") ' modify "Sheet1" to your sheet's name where your Pivot Data exists
Set PvtSht = Worksheets("Sheet2") ' modify "Sheet2" to your sheet's name where your Pivot Table exists

' find occupied Data Range for Pivot (starting from Cell "A1")
With DataSht
    LastRow = .Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
    LastCol = .Cells.Find("*", searchorder:=xlByColumns, searchdirection:=xlPrevious).Column

    SrcData = .Name & "!" & .Range(.Cells(1, 1), .Cells(LastRow, LastCol)).Address(ReferenceStyle:=xlR1C1)
End With

' add this line in case the Pivot table doesn't exit
On Error Resume Next
Set PTTbl = PvtSht.PivotTables("PivotTable1") ' set "PivotTable1" in your Pivot sheet

With PTTbl
    If .PivotCache.SourceData Like SrcData Then
        MsgBox "Pivot Cache Source Data and current Data are identical : " & SrcData
    Else
        MsgBox "Pivot Cache Source Data is : " & .PivotCache.SourceData & ", " & vbCr & _
                " while current Data is : " & SrcData
    End If

End With

End Sub