【问题标题】:Error when creating VBA for changing data source in several Pivot Tables创建 VBA 以更改多个数据透视表中的数据源时出错
【发布时间】:2018-05-11 09:04:48
【问题描述】:

我正在尝试创建一个 VBA 来更改同一数据文件和工作表中多个数据透视表中的数据源。 数据源位于另一个工作簿中,并且每周都会使用新数据进行更新。

“FY 18.xlsb” - 包含数据的工作簿

“数据” - 包含 whe 数据的“FY 18.xlsb”中的工作表

“数据透视表” - 活动工作簿中的工作表,其中可以找到应更新的数据透视表。

我希望 VBA 在数据工作表中找到终点,或者有一个可以选择数据范围的弹出窗口。

在“pt.ChangePivotCache pc”处的代码上运行调试时停止

任何人有任何想法可能是错的吗?或者有什么想法可以更新代码吗?

Sub AdjustPivotDataRange()
Dim pt As PivotTable, pc As PivotCache
Dim dataSheet As Worksheet, ws As Worksheet, wks As Worksheet
Dim StartPoint As Range, dataSource As Range, NewRange As String

' Datasource workbook and worksheet
Set wkb = Workbooks("FY 18.xlsb")
Set wks = wkb.Worksheets("Data")

' Worksheet
Set ws = ActiveWorkbook.Worksheets("Pivot Table")

' Dynamically retrieve range address of data
Set StartPoint = wks.Range("A1")
Set dataSource = wks.Range(StartPoint, StartPoint.SpecialCells(xlLastCell))
NewRange = wks.Name & "!" & dataSource.Address(ReferenceStyle:=xlR1C1)

' Create new PivotCache
Set pc = ThisWorkbook.PivotCaches.Create( _
           SourceType:=xlDatabase, _
           SourceData:=NewRange)

' Loop through all tables in worksheet
For Each pt In ws.PivotTables

        ' update pivot source and refresh
        pt.ChangePivotCache pc
        pt.RefreshTable

Next pt 
End Sub

编辑: 做我想做的新代码!

Sub AdjustPivotDataRange()
Dim pt As PivotTable, pc As PivotCache
Dim dataSheet As Worksheet, ws As Worksheet, wks As Worksheet
Dim StartPoint As Range, dataSource As Range, NewRange As String

' Datasource workbook and worksheet
Set wkb = Workbooks("Nordics SQI - FY 19.xlsb")
Set wks = wkb.Worksheets("Data")

' Worksheet
Set ws = ActiveWorkbook.Worksheets("Pivot Table")

' Dynamically retrieve range address of data
 Set dataSource = wks.Range("A1").CurrentRegion

' Loop through all tables in worksheet
For Each pt In ws.PivotTables

        ' update pivot source and refresh
        pt.ChangePivotCache ThisWorkbook.PivotCaches.Create( _
           SourceType:=xlDatabase, _
           SourceData:=dataSource)
        pt.RefreshTable

Next pt

End Sub

【问题讨论】:

  • 如果所有这些 Pivot 共享完全相同的数据源,它们也都共享相同的 PivotCache。所以你只需要刷新一次缓存。此外,如果您的数据源是 Excel 表,您的 PivotCache 应该在刷新时获取任何新数据。这意味着您可能不需要任何此代码。
  • 我遇到了一些问题。但会再看一遍。
  • 试过了,工作了一次,今天我应该更新它不适用于 Excel 表的数据,我需要选择范围。虽然,我添加了一个切片器,这可以使不一样?

标签: vba excel pivot-table


【解决方案1】:

第一个想法- PivotCache 数据源应该只是一个连续的范围,因此尝试这样:

'Set StartPoint = wks.Range("A1") 'not required
Set dataSource = wks.Range("A1").currentregion
'NewRange = wks.Name & "!" & dataSource.Address(ReferenceStyle:=xlR1C1) 'not required

' Create new PivotCache
Set pc = ThisWorkbook.PivotCaches.Create( _
           SourceType:=xlDatabase, _
           SourceData:=dataSource) '!!

EDIT 参考已编辑的问题:

我不确定在 lop 中为每个单独的数据透视表创建新的 PivotCache 是否有效。尝试将此解决方案结合我的第一个答案和您提出的解决方案:

未测试

Dim newPC as PivotCache
Set newPC = ThisWorkbook.PivotCaches.Create( _
           SourceType:=xlDatabase, _
           SourceData:=dataSource)

For Each pt In ws.PivotTables

        ' update pivot source and refresh
        pt.ChangePivotCache newPC
        pt.RefreshTable

Next pt

【讨论】:

  • 它似乎工作了!当我对其进行一些测试时会回来!谢谢!
  • 它仍然想调试“pt.ChangePivotCache pc”,但是在运行它时,我的两个数据透视表之一被更新了......
  • 它运行代码一次,但是当它应该更新数据透视表编号 2 时它卡住了。
  • 问题是以前的和新的 PivotCache 范围是否涵盖同一组字段?有些东西可能会丢失,有些东西可能会有所不同
  • 旧范围为 Data'!$A$1:$X$153695 新范围 Data'!$A$1:$X$209475。两者从一开始就具有相同的范围。
【解决方案2】:

不需要 VBA。只需将源范围更改为 Excel 表,然后将数据透视表重新指向该表,因为表是动态命名范围。从那时起,您的表将自动增长以适应新数据,并且任何时候您只刷新 一个 PivotTable,它们都将被刷新,因为它们都共享同一个 PivotCache。

【讨论】:

  • 在源工作簿中已经将范围作为 Excel 表,但它不想复制为范围以外的内容,但会再试一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2014-06-16
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多