Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA重新应用透视表数据源_Excel_Vba - Fatal编程技术网

Excel VBA重新应用透视表数据源

Excel VBA重新应用透视表数据源,excel,vba,Excel,Vba,我有一个宏,可以将工作簿中的两张工作表复制到它们自己的工作簿中。一个工作表有一些使用命名范围定义的数据,第二个工作表有多个数据透视表,所有数据源均为所述命名范围candData 一旦工作表复制完毕,我的切片器就会失去一些报告连接 为了重新连接它们,我必须手动选择每个透视表并再次设置数据源,即使已经设置了数据源。(我只需单击更改数据源,然后立即单击确定,而不实际更改任何内容。) 对每个透视表执行此操作后,将再次显示所有报表连接 我使用以下宏循环遍历每个透视表并重新应用数据源,然后重新连接每个切

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

一旦工作表复制完毕,我的切片器就会失去一些报告连接

为了重新连接它们,我必须手动选择每个透视表并再次设置数据源,即使已经设置了数据源。(我只需单击
更改数据源
,然后立即单击确定,而不实际更改任何内容。)

对每个透视表执行此操作后,将再次显示所有报表连接

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

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

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

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

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

MyPivot.ChangePivotCache .PivotCaches.Create(SourceType:=xlDatabase, SourceData:="candData")
而是在循环之前先为数据透视表(1)创建数据透视缓存:

.Sheets("Pivots").PivotTables(1).ChangePivotCache .PivotCaches.Create(SourceType:=xlDatabase, SourceData:="candData")
然后在循环中,将所有数据透视表设置为使用数据透视表的缓存(1)


我没怎么用切片机,但是。。。更新切片器后再执行另一个
PivotTable.refreshttable
(即使在逻辑上更改pivot缓存似乎也会这样做),怎么样。另外,如果您还没有看到它,它可能会很有用。谢谢您的链接。在更新每个数据源之后,我尝试了一次表刷新,通过VBA处理透视表的每一种方法都不会带来任何麻烦。当我手动设置数据源时,它只会进行“硬”刷新。当手动设置数据透视表的数据源时,Excel将自动重用默认覆盖相同范围的现有数据透视缓存。您的代码为每个数据透视表创建一个新的数据透视缓存,这将首先耗尽文件的大小,但也可能导致跨多个缓存的切片器出现问题。您是否尝试过先创建一个缓存,然后将所有数据透视表设置为使用该缓存?我同意@Michael的观点,您只需要一个数据透视缓存。我还没有尝试过,主要是因为我不明白,当首先复制此工作表时,肯定已经创建了数据透视缓存?我假设表刷新会更新此数据透视缓存,但这似乎不会发生。有没有办法删除数据透视缓存并创建一个新的数据透视缓存?谢谢Michael,我在
MyPivot.ChangePivotCache.Sheets(“Pivots”).PivotTables(1).pivotcache
的循环中遇到了一个
无效的过程调用
错误,你知道是什么原因吗?哎呀,你不能这样引用数据透视表的缓存。在这种情况下,ChangePivotCache方法只需要一个数据透视表引用。我已经修复了答案。不幸的是,仍然触发
无效过程调用
错误。
MyPivot.ChangePivotCache .Sheets("Pivots").PivotTables(1)