【问题标题】:Updating data source on multiple pivot tables within Excel在 Excel 中更新多个数据透视表上的数据源
【发布时间】:2020-02-14 20:54:23
【问题描述】:

是否有一种简单的方法可以同时更新单个 Excel 工作表上多个数据透视表的数据源?

所有数据透视表都引用相同的命名范围,但我需要创建第二个具有相同数据透视表但访问不同命名范围的工作表。

理想情况下,我希望能够进行某种搜索和替换操作(就像您可以在公式上做的那样),而不是手动更新每个单独的数据透视表。

有什么建议吗?

【问题讨论】:

    标签: excel pivot-table


    【解决方案1】:

    以下 VBA 代码将更改单个工作表上所有数据透视表的数据源。

    您需要将Sheet2 参数更新为具有新数据透视表的工作表名称,并将Data2 参数更新为新命名范围。

    Sub Change_Pivot_Source()
    
        Dim pt As PivotTable
    
        For Each pt In ActiveWorkbook.Worksheets("Sheet2").PivotTables
                 pt.ChangePivotCache ActiveWorkbook.PivotCaches.Create _
                    (SourceType:=xlDatabase, SourceData:="Data2")
        Next pt
    
    End Sub
    

    【讨论】:

    • 做得很好,谢谢
    【解决方案2】:

    假设您愿意使用 VBA,this 可能是相关的。

    如果您遍历每个工作表上的数据透视表集合,您应该能够使用该帖子中显示的方法来修改数据源。语法应该非常类似于使用命名范围而不是单元格范围。

    【讨论】:

      【解决方案3】:

      我结合了上述代码,现在结合下面的代码,您可以对源数据使用表或范围引用。您所要做的就是通过替换 * 符号将源数据放入您的源数据中,然后您就可以开始了。

      Sub Change_Pivot_Source()
      
      Dim pt As PivotTable
      Dim ws As Worksheet
      
      For Each ws In ActiveWorkbook.Worksheets
      
      For Each pt In ws.PivotTables
               pt.ChangePivotCache ActiveWorkbook.PivotCaches.Create _
                  (SourceType:=xlDatabase, SourceData:="*****")
      Next pt
      Next ws
      
      End Sub
      

      【讨论】:

        【解决方案4】:

        改编自Dynamically Change A Pivot Table's Data Source Range With This VBA Macro Code

        1. @987654322@.@987654323@ 属性可以通过ChangePivotCache 方法设置。
        2. 要创建新的PivotCache,请致电@987654326@.@987654327@.@987654328@
        3. 您需要将SourceTypeRange 作为SourceData 传递。
        4. 最后,一旦更新,请务必致电RefreshTable 应用更改。

        这是一个示例,它将自动查找工作簿中的每个数据透视表并对其进行更新。

        Sub AdjustPivotDataRange()
            Dim pt As PivotTable, pc As PivotCache
            Dim dataSheet As Worksheet, ws As Worksheet
            Dim startPoint As Range, dataSource As Range, newRange As String
        
            ' get worksheet with data
            Set dataSheet = ThisWorkbook.Worksheets("Sheet1")
        
            ' Dynamically Retrieve Range Address of Data
            Set startPoint = dataSheet.Range("A1")
            Set dataSource = dataSheet.Range(startPoint, startPoint.SpecialCells(xlLastCell))
            newRange = dataSheet.Name & "!" & dataSource.Address(ReferenceStyle:=xlR1C1)
        
            ' create new PivotCache
            Set pc = ActiveWorkbook.PivotCaches.Create( _
                       SourceType:=xlDatabase, _
                       SourceData:=newRange)
        
            ' loop through all tables in all sheets
            For Each ws In ActiveWorkbook.Worksheets
                For Each pt In ws.PivotTables
        
                    ' update pivot source and refresh
                    pt.ChangePivotCache pc
                    pt.RefreshTable
        
                Next pt
            Next ws
        
        End Sub
        

        只需将"Sheet1" 替换为您的数据源所在的位置。

        【讨论】:

        • @kilemit:我只是让代码保持一致。使用两次 activeworkbook 或两次 thisworkbook,但建议的组合肯定会带来麻烦。仅当活动工作簿是此工作簿时才有效。
        猜你喜欢
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 2011-10-21
        • 2019-09-20
        • 2014-06-16
        • 1970-01-01
        相关资源
        最近更新 更多