我写了一些代码来查找到“文件A”的外部链接,并将其替换为“文件B”的链接。代码在PowerPoint中,“文件A”和“文件B”都是excel文件。 PowerPoint文件中有大约25个链接到excel的“对象”(这些对象主要是粘贴到PowerPoint中作为链接对象的excel单元格)。
该代码有效,但是需要7-8分钟才能运行。知道为什么需要那么长时间或如何使其更快吗?看来它所做的只是查找和替换文本,所以我很困惑为什么要花这么长时间。
代码的相关部分:
Dim newPath As String
Dim templateHome As String
Dim oshp As Shape
Dim osld As Slide
Dim vizFile As Workbook
Dim vizFname As String
Dim replacethis As String
Dim replacewith As String
'3. Update links:
'(Replace links to template file link with links to new copy of the file)
replacethis = templateHome & vizFname
replacewith = newPath & "\" & vizFname
On Error Resume Next
For Each osld In ActivePresentation.Slides
For Each oshp In osld.Shapes
oshp.LinkFormat.SourceFullName = Replace(oshp.LinkFormat.SourceFullName, replacethis, replacewith)
oshp.LinkFormat.Update
Next oshp
Next osld
答案 0 :(得分:3)
这段代码很干净,因此您可能无法做很多优化工作,但是我要提醒您,它所做的不仅仅是“查找和替换文本” :)每次调用UpdateLink
都会检索来自某些外部来源的数据。这不只是简单的字符串替换!
首先:On Error Resume Next
吞没了很多错误(即,不是链接对象的任何形状,因此,大多数错误),这可能会增加运行时间和力量如果您围绕这些错误进行编码,而不是仅仅与Resume Next
一起吃,就会更好。
' On Error Resume Next ' ## Comment or remove this line :)
For Each osld In ActivePresentation.Slides
For Each oshp In osld.Shapes
If oshp.Type = msoLinkedOLEObject Then
oshp.LinkFormat.SourceFullName = Replace(oshp.LinkFormat.SourceFullName, replacethis, replacewith)
oshp.LinkFormat.Update
End If
Next
Next
此外,您正在反复调用oshp.LinkFormat.Update
。最好在循环中替换所有文本,但是与其更新单个链接,不如使用Presentation.UpdateLinks
方法在循环外一次更新所有链接,
' On Error Resume Next ' ## Comment or remove this line :)
For Each osld In ActivePresentation.Slides
For Each oshp In osld.Shapes
If oshp.Type = msoLinkedOLEObject Then
oshp.LinkFormat.SourceFullName = Replace(oshp.LinkFormat.SourceFullName, replacethis, replacewith)
' ## REMOVE oshp.LinkFormat.Update
End If
Next
Next
' Now, update the entire presentation:
ActivePresentation.UpdateLinks