是否有一种简单的方法可以同时在单个Excel工作表上更新多个数据透视表的数据源?
所有数据透视表都引用相同的命名范围,但我需要创建第二个工作表,该工作表具有相同的数据透视表,但访问不同的命名范围。
理想情况下,我希望能够进行某种搜索和替换操作(就像你可以对公式做的那样),而不是手动更新每个数据透视表。
有什么建议吗?
答案 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
PivotTable
。SourceData
属性,该属性通过ChangePivotCache
方法设置,该方法采用PivotCache
个对象。要创建一个,请拨打ActiveWorkbook
。PivotCaches
。create
,其中SourceType
和range
为SourceData
。最后,更新后,请务必致电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