我对此疯狂研究过,我担心没有答案。但也许这个网站上真正聪明的人可以提供帮助。
我有两个可以协同工作的工作簿 - Charts.xlsm和Data.xlsm。它们始终保存在同一文件夹中。 Charts.xlsm显然包含了我的所有图表,但是它们都链接到Data.xlsm中的表来源。我的Charts.xlsm中还有许多连接到图表的切片器,当它们连接到具有相同数据源的图表时,它们共享缓存。这两个工作簿总是同时打开,因此数据源引用如下所示:'Data.xlsm'!Table1
这一切都很好,直到我把这些工作簿放在另一台计算机上(这就是为什么我这样做,所以我需要找出如何解决这个问题)。
关闭工作簿后,源数据引用将更改为我的硬盘上的特定位置:'C:\ Folder \ Data.xlsm'!Table1
如果我想手动将其更改回本地引用,我必须首先通过并断开每个切片器,刷新表,然后重新连接每个切片器。对我的客户来说,这不是一个可行的解决方案。
每次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时保持我的图表的相对位置,这样无论我在哪台计算机上打开这些工作簿,他们将永远积极联系。
提前多多谢谢你!
答案 0 :(得分:2)
如果两个文件总是在同一个文件夹中,你可以这样做。
一个。关闭Chart.xlsm文件的自动“UpdateLinks”。您可以手动执行此操作,或者出于安全原因,始终在BeforeClose
事件触发时避免一些可能的问题:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.UpdateLinks = xlUpdateLinksNever
End Sub
B中。当您打开Chart.xlsm时,使用Workbook Open事件更改指向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
我承认我没有考虑所有风险,因此需要进行一些测试。