分享PivotCache for PivotTables使用数据模型构建

时间:2015-07-07 16:56:07

标签: excel vba excel-vba pivot-table

我只是在清理我的工作簿,并且使用了以下代码来整合我的PivotCaches(在清理之前我有大约200个。)

Sub changeCache()
Dim ws As Worksheet
Dim pt As PivotTable
Dim pc As PivotCache
Dim first As Boolean
On Error Resume Next

    For Each ws In ActiveWorkbook.Worksheets
        ws.Activate
        For Each pt In ActiveSheet.PivotTables

            If first = False Then
                Set pc = pt.PivotCache
                first = True
            End If 

            pt.CacheIndex = pc.Index

        Next pt
    Next ws

End Sub

这使我的PivotCache数量减少到33。

Sub CountCaches()
  MsgBox ActiveWorkbook.PivotCaches.Count
End Sub

它是33而不是1的原因是因为我有32个使用数据模型构建的数据透视表。

我的问题是:有谁知道如何更改使用数据模型构建的数据透视表,所有人都使用相同的PivotCache?

修改

我的第二个问题是:多个数据透视表都建立在数据模型上

a)引用单一数据模型;或

b)每个人都有自己的模型,因此“膨胀”了Excel文件

EDIT2

在进一步探索中,似乎对引用相同数据的数据透视表共享数据模型 。这可以在“连接”中找到(位于功能区的“数据”选项卡下)。理论上,即使代码ActiveWorkbook.PivotCaches.Count计算共享连接的每个数据透视表并且错误地(?)表示多个缓存,这也不应该“膨胀”文件。

然而,如果有人可以提供更明确的答案,我将保持赏金。

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你只需将每台电脑设置为第一台。所以,第一遍,给pc一些其他名称,如pcfirst,然后对于每个剩余的缓存,设置pc = pcfirst。这里有一些来源信息http://www.contextures.com/xlPivot11.htmlhttp://www.mrexcel.com/forum/excel-questions/380933-set-multiple-pivot-cache-read-one-cache.html

答案 1 :(得分:1)

我还没有真正习惯数据模型,我无法对此提供无疑的解释。

但是我使用该代码来清理我正在处理的报告系统之一,这可能会帮助您减少数据透视表的数量:

Sub Caches_Matches()
Dim Ws1 As Worksheet, _
    Pt1 As PivotTable, _
    Ws2 As Worksheet, _
    Pt2 As PivotTable, _
    PcNb As Integer

PcNb = ActiveWorkbook.PivotCaches.Count
MsgBox "PivotCaches.Count = " & PcNb, vbInformation + vbOKOnly, "Before update"

On Error Resume Next

    For Each Ws1 In ActiveWorkbook.Worksheets
        For Each Pt1 In Ws1.PivotTables
            'fix one pt, loop all of them and set same cache if same source
            For Each Ws2 In ActiveWorkbook.Worksheets
                For Each Pt2 In Ws2.PivotTables
                    If Pt1.SourceData <> Pt2.SourceData Or Pt1.PivotCache = Pt2.PivotCache Or Pt1.Name = Pt2.Name Then
                    Else
                        Pt2.CacheIndex = Pt1.PivotCache.Index
                    End If
                Next Pt2
            Next Ws2
        Next Pt1
    Next Ws1

MsgBox "PivotCaches.Count = " & ActiveWorkbook.PivotCaches.Count & Chr(10) & _
        "Before update = " & PcNb, vbInformation + vbOKOnly, "After update"
End Sub