在Excel中的多个数据透视表上更新数据源

时间:2010-03-26 11:13:27

标签: excel pivot-table

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

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

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

有什么建议吗?

4 个答案:

答案 0 :(得分:11)

以下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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我将上面的代码和现在的下面的代码结合在一起,可以将表或范围引用用于源数据。您所要做的只是替换*符号将其放入源数据中,您就很好了。

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

答案 3 :(得分:0)

这是一个有用的方法,改编自Dynamically Change A Pivot Table's Data Source Range With This VBA Macro Code

PivotTableSourceData属性,该属性通过ChangePivotCache方法设置,该方法采用PivotCache个对象。要创建一个,请拨打ActiveWorkbookPivotCachescreate,其中SourceTyperangeSourceData。最后,更新后,请务必致电RefreshTable以应用更改。

以下是代码中的内容。只需将Sheet1替换为数据源所在的位置即可。这将自动查找工作簿中的每个数据透视表并进行更新。

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 = ThisWorkbook.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