Как сделать так, чтобы код VBA "редактировать ссылки" работал быстрее? - PullRequest
0 голосов
/ 06 июня 2019

Я написал код для поиска внешних ссылок на «файл A» и заменил их ссылками на «файл B». Код находится в PowerPoint, «файл A» и «файл B» оба являются файлами Excel. Файл PowerPoint содержит около 25 «объектов», связанных с Excel (объекты - это, в основном, просто ячейки из Excel, вставленные в PowerPoint как связанные объекты).

Код работает, но его запуск занимает 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

1 Ответ

3 голосов
/ 06 июня 2019

Этот код довольно чистый, поэтому, вероятно, вы мало что можете сделать, чтобы оптимизировать его, но я хотел бы предостеречь вас, что он делает больше, чем просто "поиск и замена текста" :) Каждый вызов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...