【问题标题】:Change datasource for an existing pivot cache更改现有数据透视缓存的数据源
【发布时间】:2015-11-10 10:14:33
【问题描述】:

我有大约十个数据透视表,每个数据透视表都在另一个工作表上。

我需要将它们中的每一个的数据源更改为相同的值。 Pivotcaches.count 给我这个工作簿的 1,所以我假设每个表都指向这个缓存。

您对如何更改此缓存而不是创建十个新缓存有什么建议吗?

这是我得到的:

Sub Test(Ziel As String, Zieltab As String)
    Dim RNG As Range
    Dim letzteZeile As Double
    Dim letzteSpalte As Double
    Dim Spalte As String
    Dim Index As Integer
    Dim Wb As Workbook
    Dim Ws As Worksheet
    Dim pC As PivotCache
    Dim pT As PivotTable


    letzteZeile = Workbooks(Ziel).Worksheets(Zieltab).UsedRange.SpecialCells(xlCellTypeLastCell).Row
    letzteSpalte = Workbooks(Ziel).Worksheets(Zieltab).Range("A1").SpecialCells(xlCellTypeLastCell).Column
    Spalte = Split(Workbooks(Ziel).Worksheets(Zieltab).Cells(1, letzteSpalte).Address, "$")(1)

    Set RNG = Worksheets(Zieltab).Range("A1:" & Spalte & letzteZeile)



    Set Wb = ActiveWorkbook
    Set pC = Wb.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="'" & Wb.Sheets(Zieltab).Name & "'!" & RNG.Address, Version:=xlPivotTableVersion12)


    For Each Ws In Wb.Sheets
        For Each pT In Ws.PivotTables
            Set pT.PivotCache = pC
        Next pT
    Next Ws
End Sub

这是它的实际外观。它说方法不会匹配或类似的东西。

【问题讨论】:

    标签: vba excel pivot-table


    【解决方案1】:

    由于您只有一个数据透视缓存,您需要创建一个新的,然后将其应用到您的数据透视表。

    这里的 Pivot Cache 是从名为 Sheet_Name 的工作表中名为 Named_Range 的范围创建的,我留给您重命名这些以满足您的需要! ;)

    Sub Test_Gring()
    Dim wB As Workbook, _
        wS As Worksheet, _
        pC As PivotCache, _
        pT As PivotTable, _
        bCreated As Boolean
    
    For Each wS In wB.Sheets
        For Each pT In wS.PivotTables
            If Not bCreated Then
                pT.ChangePivotCache wB.PivotCaches.Create(SourceType:=xlDatabase, _
                                          SourceData:="'Sheet Name'!" & Range("Named_Range").Address, _
                                          Version:=xlPivotTableVersion14)   'xlPivotTableVersion12
                Set pC = pT.PivotCache
                bCreated = True
            Else
                If pT.CacheIndex <> pC.Index Then pT.CacheIndex = pC.Index
            End If
        Next pT
    Next wS
    
    'Save to delete unused Pivot Caches
    wB.Save
    End Sub
    

    【讨论】:

    • 哇,感谢您的酷回答。数据源不需要是字符串吗?
    • @Gring :尝试编辑(我提出了 2 种可能性,我会让您选择您喜欢的一种);)
    • 谢谢,它现在应该可以正常工作了:),不幸的是我的程序不能,我仍然在索引方法上得到错误 1004,在 ChangePivotCache 上得到 483(对象不支持这个属性或方法")
    • pC.Index 返回 0,这正常吗?
    • 枢轴缓存。伯爵说,我只有一个缓存
    【解决方案2】:

    我同意 R3UK 的回答,但是我在使用数据透视表和数据透视缓存的 Create 方法时遇到了太多的跨版本问题(Excel 2013 到 Excel 2010)。最后一个参数 Version 更改了其名称,或者 Excel 2013 (Application.Version 15.0) 数据透视表标准 (xlPivotTableVersion15) 在使用时无法被 Excel 2010 (Application.Version15) 识别。 14.0 版)(标准 xlPivotTableVersion14),我想。

    我发现 Add 方法的风险较小。它可以用于以类似的方式轻松创建数据透视表。

    Sub ChangeCacheWithAdd()
    Dim wB As Workbook, _
        wS As Worksheet, _
        pC As PivotCache, _
        pT As PivotTable, _
        bCreated As Boolean
    
    For Each wS In wB.Sheets
        For Each pT In wS.PivotTables
            If Not bCreated Then
                Set pC = wB.PivotCaches.Add(SourceType:=xlDatabase, _
                       SourceData:="'Sheet Name'!" & Range("Named_Range").Address
                pT.ChangePivotCache pC
                bCreated = True
            Else
                If pT.CacheIndex <> pC.Index Then pT.CacheIndex = pC.Index
            End If
        Next pT
    Next wS
    
    'Save to delete unused Pivot Caches
    wB.Save
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多