我需要更改大型PPT演示文稿中的链接列表。我有工作代码,做得很好。最近我升级到Office 2016,现在脚本无法正常工作。
我简单地将旧的和新的路径字符串放在一个二维数组中,然后通过它们来纠正PPT中的链接。
这里面有一些调试代码,并且在我尝试修复它的地方注释了一行,请忽略。
For j = 0 To UBound(MyArray)
oldString = MyArray(j, 0)
newString = MyArray(j, 1)
If Len(oldString) > 1 Then
For Each pptSlide In ActivePresentation.Slides
For Each pptShape In pptSlide.Shapes
If (pptShape.Type = msoLinkedOLEObject) Or (pptShape.Type = msoChart) Then
' With pptShape.LinkFormat
If InStr(1, (pptShape.LinkFormat.SourceFullName), (oldString), 1) Then
' debug points
q = pptShape.Id
r = pptShape.Name
s = pptSlide.SlideIndex
t = pptSlide.SlideNumber
' The actual source link
x = pptShape.LinkFormat.SourceFullName
' substitute source link with new string
y = Replace(x, oldString, newString)
' Further adjust new link so any spaces in tab names have %20
y = Replace(y, "%20", " ")
'y = Replace(y, " ", "%20")
'y = Replace(y, "file:///", "")
' ignore errors when can't see new link
On Error Resume Next
pptShape.LinkFormat.SourceFullName = y
DoEvents
' debug assignment
w = pptShape.LinkFormat.SourceFullName
Debug.Print "old string " & oldString
Debug.Print "replacement string " & newString
Debug.Print "org link x " & x
Debug.Print "new link y " & y
Debug.Print "result w " & w
Debug.Print "---"
Debug.Print ""
End If
' End With
End If
DoEvents
Next pptShape
DoEvents
Next pptSlide
End If
Next
PPT 2016已将链接更改为HTML,前面有一个文件:///并将所有空格更改为“%20”
以下是运行我的脚本的几个示例。现在,如果我有不同的路径和不同的文件名,则需要在每次传递中使用不同的“匹配”字符串(一个带有,一个没有%20)的代码通过2次。如果文件名相同,那么它将在代码的一次传递中执行,但它会为每个链接打开文件4次。因为我有数百个非常耗时的链接。
同样在2015年的办公室,只要我打开目标,就不会重新开启。现在,如果我打开目标,我会收到错误消息,说它无法打开同名的2个文件。
带有差异路径和差异文件名的示例1 ,所有苍蝇都已关闭。
将代码转换为包含要更改的链接的代码:
MyArray(0, 0) = "file:///\\aFolder\bFolder\Reports\daily%20report%20generator.xlsm!Site%20Completions!R2C2:R17C17" MyArray(0, 1) = "file:///\\aFolder\bFolder\Reports\Rpt-Other\daily%20report%20generator2.xlsm!Site%20Completions!R2C2:R17C17"
调试器中报告的原始链接:
file:///\\aFolder\bFolder\Reports\daily%20report%20generator.xlsm!Site%20Completions!R2C2:R17C17
第一遍,打开文件两次(假定目标和来源),导致链接缺少%20但没有更改路径或文件名:
\\aFolder\bFolder\Reports\daily report generator.xlsm!Site Completions!R2C2:R17C17
更改数组的第一个元素(源路径)并第二次运行代码。这次匹配字符串是相同的,除了w / o%20。同样,它在这个传递中打开了2个文件,这次它改变了路径和文件名:
\\aFolder\bFolder\Reports\Rpt-Other\daily report generator2.xlsm!Site Completions!R2C2:R17C17
第二个例子,文件名相同,只有路径更改。两个文件都没有打开。只有一个链接可以更新。
原始链接:
file:///\\aFolder\bFolder\Reports\daily%20report%20generator.xlsm!Site%20Completions!R2C2:R17C17
传递1打开一个文件4次,但不像在示例1中那样运行2次脚本,结果是:
\\aFolder\bFolder\Reports\Rpt-Other\daily report generator.xlsm!Site Completions!R2C2:R17C17
不是什么大不了但值得注意的是:如果我保存文件,链接不会改变,但如果我保存,关闭重新打开,PPT将file:///和%20添加回原始链接。
似乎文件名的HTML化已经改变了它的工作方式。它导致文件每个链接打开4次。每个来源和目标显然是两次。
在第一个更改文件名和路径的示例中,最糟糕的是,我必须运行两次脚本,将源/匹配字符串从中更改为不使用“%20”以使其成功。
任何人都知道如何解决这个问题?
1/26/17:为了更好的格式和清晰度而编辑了一些。