Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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 2010:如何在不断开切片器的情况下更改透视表源数据?_Excel_Vba_Pivot Table - Fatal编程技术网

Excel 2010:如何在不断开切片器的情况下更改透视表源数据?

Excel 2010:如何在不断开切片器的情况下更改透视表源数据?,excel,vba,pivot-table,Excel,Vba,Pivot Table,我对此进行了疯狂的研究,我担心没有答案。但也许这个网站上真正聪明的人能帮上忙 我有两本工作手册可以一起使用-Charts.xlsm和Data.xlsm。它们总是放在同一个文件夹中。Charts.xlsm显然包含了我所有的图表,但是它们都链接到Data.xlsm中的表作为它们的源。我的Charts.xlsm中还有很多切片器连接到图表,当它们连接到具有相同数据源的图表时,它们共享缓存。两个工作簿始终同时打开,因此数据源引用如下所示:“data.xlsm”!表1 这一切都很好,直到我把这些工作簿放在另

我对此进行了疯狂的研究,我担心没有答案。但也许这个网站上真正聪明的人能帮上忙

我有两本工作手册可以一起使用-Charts.xlsm和Data.xlsm。它们总是放在同一个文件夹中。Charts.xlsm显然包含了我所有的图表,但是它们都链接到Data.xlsm中的表作为它们的源。我的Charts.xlsm中还有很多切片器连接到图表,当它们连接到具有相同数据源的图表时,它们共享缓存。两个工作簿始终同时打开,因此数据源引用如下所示:“data.xlsm”!表1

这一切都很好,直到我把这些工作簿放在另一台计算机上(这就是为什么我要这么做,所以我需要找出如何解决这个问题)

关闭工作簿后,源数据引用将更改为硬盘上的特定位置:“C:\Folder\data.xlsm”!表1

如果我想手动将其更改回本地引用,我必须首先检查并断开每个切片器,刷新表,然后重新连接每个切片器。对我的客户来说,这不是一个可行的解决方案

每次打开Charts.xlsm时,我都会使用VBA更改引用,但当我尝试使用它时,会发生以下两种情况之一:要么工作簿产生错误,无法保存,要么Excel会完全崩溃

这段代码非常适用于断开切片器,但会产生“保存”错误:

Sub Disconnect_Slicers()

Dim oSliceCache As SlicerCache
Dim PT As PivotTable
Dim i As Long

For Each oSliceCache In ThisWorkbook.SlicerCaches
    With ActiveWorkbook.SlicerCaches(oSliceCache.Name).PivotTables
        For i = .Count To 1 Step -1
            .RemovePivotTable (.Item(i))
        Next i
    End With
Next oSliceCache

End Sub
所以。。。我正在询问Excel/VBA天才们,当他们查找Data.xlsm时,是否有任何方法可以维护图表的相对位置,以便无论我在哪台计算机上打开这些工作簿,它们都将始终处于主动链接状态


提前非常感谢

如果两个文件总是在同一个文件夹中,您可以这样做

A.关闭Chart.xlsm文件的自动“更新链接”。您可以手动执行此操作一次,或者出于安全原因,始终在关闭前
事件触发时执行此操作,以避免出现一些可能的问题:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.UpdateLinks = xlUpdateLinksNever
End Sub
B.打开Chart.xlsm时,使用工作簿打开事件+另外刷新链接,将链接更改为Data.xlsm。在这种情况下,我们检查Chart.Xlsm文件的路径,并在同一文件夹中搜索Data.Xlsm。我假设只有一个指向任何其他文件的链接,否则可能需要进行一些更改:

Private Sub Workbook_Open()
'changing first and only one link to new one
Dim a
a = ActiveWorkbook.LinkSources
    ThisWorkbook.ChangeLink Name:=a(1), _
        NewName:=ThisWorkbook.Path & "\Data.xlsm", Type:=xlExcelLinks    
'update the link
ThisWorkbook.UpdateLink Name:=a(1), Type:=xlExcelLinks
End Sub

我承认我没有考虑所有的风险,因此需要进行一些测试。 警告!
Disconnect\u Slicers()
sub实际上破坏了我的Excel程序-现在什么也保存不了。我不知道这么小的东西怎么会破坏Excel的内部工作,但它确实破坏了。所以建议小心。这似乎很有效!非常感谢你!我喜欢学习有关Excel的新知识:)