【发布时间】:2019-01-24 00:36:58
【问题描述】:
我正在开发一个基于 Excel 的模板,以直接与相应的 Powerpoint 模板链接,并在此过程中发现 MS 的相对链接通过默认为父目录而发生了变化(将链接的文件留在同一文件夹中意味着它们可以被移动/复制/等,链接会更新)。
我在 Excel VBA 中尝试了一些解决方案,目前唯一可行的选项包括将 PPT 保存为 XML 文件,然后使用传入的变量构造的新文件路径查找/替换 (PowerShell) 旧文件路径来自 Excel 文件。
Sub ChangeOLELinks()
Dim oSld As Slide
Dim oSh As Shape
Dim sOldPath As String
Dim sNewPath As String
sOldPath = "C:\__oldpath\oldfolder\old.xlsm"
sNewPath = "C:\__New Dangerous\Dangerous.xlsm"
For Each oSld In ActivePresentation.Slides
For Each oSh In oSld.Shapes
' Change only linked OLE objects
If oSh.Type = msoLinkedOLEObject Then
On Error Resume Next
' Verify that file exists
If Len(Dir$(Replace(oSh.LinkFormat.SourceFullName, sOldPath, sNewPath))) > 0 Then
oSh.LinkFormat.SourceFullName = Replace(oSh.LinkFormat.SourceFullName, oSh.LinkFormat.SourceFullName, sNewPath)
End If
End If
Next ' shape
Next ' slide
MsgBox ("Done!")
上面的代码运行并更新了链接,但只是一些。我的 PPT 包含直接来自工作表和图表的链接“网格”,无论出于何种原因,下面的代码仅更新网格。
即使有解决方法来更新所有形状/OLE 对象,有没有办法可以从 Powerpoint VBA 中的 Excel 工作表中传递变量?
【问题讨论】:
-
由于您的代码包含 On Error GoTo errorHandler,我将添加 errorHandler 标签和代码。我猜你已经做到了,只是没有将它包含在你粘贴在这里的代码中,否则它不会编译或运行。此外,在重新链接到不同位置的文件之前,该文件必须实际存在。如果没有,PPT 不会发出声音,但不会改变链接。
-
@SteveRindsberg - 是的,谢谢!处理明智这是最后一步,所以文件肯定会在那里,但是 PPT 仍然只是链接一些链接。我有一半希望得到“IDK”响应,因为我距离获得一个漂亮的 PowerShell 脚本以更新 PPT 模板的 .xml 版本并另存为 > 新位置\新名称只有几行之遥,但再次想到了这个问题这里可能对其他人有帮助。
-
一个想法:如果只是图表没有更新,作为测试,打开演示文稿,选择其中一个图表并按 DEL 键。图表只是消失了,还是留下了一个占位符(即“单击此处以{whatever}”小工具)?如果是这样,可能会有一个简单的解决方法。
-
它不会留下任何东西。作为参考,我正在使用 PPT 和 Excel 2010。 ...我还将在我的默认/模板文件名中添加大括号对我的 PowerShell 脚本造成严重破坏,所以你的评论确实让我思考。我重建了一个没有任何保留字符的 PPT/文件夹路径,所以我可以用新文件重新测试我的宏。再次感谢您的回复!
-
好的,它没有留下任何东西意味着图表不在占位符中;您的代码不会触及占位符内的任何内容,因为它们是不同的对象类型。
标签: vba powerpoint