修改
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中以另一种方式完成吗?
答案 0 :(得分:0)
您可以将当前PivotTable.PivotCache.SourceData
与工作表中的数据(占据数据透视表)进行比较。
如果String
值相同,则无需更新PivotCache
,然后刷新PivotTable
。如果值不相同,则表示数据结构已更改(添加/删除了更多行和列),您需要更新PivotCache
和Refresh
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