【问题标题】:Excel VBA re-apply pivot table data sourceExcel VBA 重新应用数据透视表数据源
【发布时间】:2019-08-29 11:44:09
【问题描述】:

我有一个宏,可以将我的工作簿中的两张工作表复制到他们自己的工作簿中。一张表有一些数据定义了一个命名范围,第二张表有多个数据透视表,所有数据源都称为命名范围candData

一旦工作表复制了我的切片器,它们的一些报表连接就会丢失。

为了重新连接它们,我必须手动选择每个数据透视表并再次设置数据源,即使数据源已经设置。 (我只需单击 Change Data Source 并立即单击 OK,实际上 没有更改任何内容。)

为每个数据透视表完成此操作后,所有报表连接都会再次显示。

我有以下宏循环遍历每个数据透视表并重新应用数据源,然后重新连接每个切片器连接,但是即使在应用数据源之后,我仍然必须手动选择每个数据透视表才能重新连接切片机。

我没有收到任何错误,它按预期逐步遍历每个数据透视表并重置数据源。为什么报表连接仅在我手动设置数据源而不是通过以下设置时才起作用的任何线索?

Sub setSlicerSource()

Dim MyPivot As PivotTable
Dim slCaches As SlicerCaches
Dim slCache As SlicerCache

Set slCaches = ActiveWorkbook.SlicerCaches

With ActiveWorkbook
    For Each MyPivot In .Sheets("Pivots").PivotTables
        MyPivot.ChangePivotCache .PivotCaches.Create(SourceType:=xlDatabase, SourceData:="candData")
    Next MyPivot

    For Each slCache In slCaches
        For Each MyPivot In .Sheets("Pivots").PivotTables
            slCache.PivotTables.AddPivotTable MyPivot
        Next MyPivot
    Next slCache
End With
End Sub

【问题讨论】:

  • 我没有使用太多切片器,但是......在更新切片器之后再做一个PivotTable.RefreshTable 怎么样(即使更改数据透视缓存在逻辑上似乎也会这样做)。另外,this 如果您还没有看到它,它似乎很有用。
  • 感谢您提供该链接。我在更新每个数据源后尝试了表刷新,通过 VBA 处理数据透视表的每一种方式都不会令人讨厌。当我看似手动设置数据源时,它只会进行“硬”刷新。
  • 手动设置数据透视表的数据源时,Excel 将自动重用默认情况下覆盖相同范围的现有数据透视缓存。您的代码为每个数据透视表创建一个新的数据透视缓存,这首先会扩大文件的大小,但也可能导致跨多个缓存的切片器出现问题。您是否尝试过先创建一个缓存,然后将所有数据透视表设置为使用该缓存?
  • 我同意@Michael,你只需要一个数据透视缓存
  • 我还没有尝试过,主要是因为我认为我不明白,当这张表首先被复制时,肯定已经创建了一个数据透视缓存吗?我认为表刷新会更新这个数据透视缓存,但这似乎没有发生。有没有办法删除一个数据透视缓存并创建一个新的?

标签: excel vba


【解决方案1】:

我不确定这是否真的能解决您的问题,但无论如何,这是我会尝试解决的第一件事:

此行当前为每个数据透视表创建一个新的 PivotCache:

MyPivot.ChangePivotCache .PivotCaches.Create(SourceType:=xlDatabase, SourceData:="candData")

相反,在循环之前首先为 PivotTables(1) 创建一个 PivotCache:

.Sheets("Pivots").PivotTables(1).ChangePivotCache .PivotCaches.Create(SourceType:=xlDatabase, SourceData:="candData")

然后在循环中,设置所有PivotTables使用PivotTables(1)的缓存

MyPivot.ChangePivotCache .Sheets("Pivots").PivotTables(1)

【讨论】:

  • 谢谢迈克尔,我在MyPivot.ChangePivotCache .Sheets("Pivots").PivotTables(1).PivotCache 的循环中收到了一个Invalid procedure call 错误,有什么想法可能导致这种情况吗?
  • 糟糕,您不能像那样引用数据透视表的缓存。在这种情况下,ChangePivotCache 方法只需要一个数据透视表引用。我已经确定了答案。
  • 不幸的是,仍然触发 Invalid procedure call 错误。
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 2014-06-16
  • 2015-09-25
  • 1970-01-01
  • 2016-05-10
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多