共享使用数据模型构建的数据透视表的 PivotCache

Posted

技术标签:

【中文标题】共享使用数据模型构建的数据透视表的 PivotCache【英文标题】:Share PivotCache for PivotTables built with data model 【发布时间】:2015-09-25 07:29:59 【问题描述】:

我只是在清理我的工作簿,并且我使用以下代码来合并我的 PivotCache(在清理之前我有大约 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 个使用 数据模型 构建的数据透视表。

我的问题是:有谁知道如何将使用数据模型构建的数据透视表更改为全部使用相同的数据透视表?

编辑

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

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

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

EDIT2

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

但是,如果有人可以提供更明确的答案,我会保留悬赏。

【问题讨论】:

查看本页信息。我还没有测试过缓存是否以相同的方式构建,但它可能会让你更接近答案。 datapigtechnologies.com/blog/index.php/… 感谢您的链接,但没有运气 【参考方案1】:

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

【讨论】:

感谢您的链接,但不幸的是,他们没有直接解决问题。它们包含一些关于清理数据透视缓存的重要信息,但似乎使用数据模型构建的数据透视表(即在创建数据透视时选中“将此数据添加到数据模型”框)不是围绕数据透视缓存构建的【参考方案2】:

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

但我使用该代码清理了我正在开发的一个报告系统,这可能会帮助您减少 PivotCache:

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

【讨论】:

感谢您的回复。不幸的是,您的代码产生的结果与我在原始问题中发布的代码相同。使用该数据模型构建的数据透视表仍会报告多个缓存。 我希望,但我没有找到太多关于该主题的工作,希望你能找到方法! 谢谢老兄!从我所做的研究来看,即使 ActiveWorkbook.PivotCaches.Count 报告了使用数据模型构建的表的多个缓存,这些缓存基本上是空的并且不会使文件膨胀(这是我的主要关注点)。 谢谢你的信息,有一天可能对我有用!

以上是关于共享使用数据模型构建的数据透视表的 PivotCache的主要内容,如果未能解决你的问题,请参考以下文章

Excle数据透视表如何创建非共享缓存的数据透视表

我应该如何为需要引用数据透视表的表配置 Laravel / OctoberCMS 模型?

如何获取附加数据透视表的数据?

laravel 检索值匹配数据透视表的所有用户

是否可以通过 Power BI 获取数据透视表的来源?

Laravel中数据透视表的访问关系