Office 2016/365 VBA не удается обновить ссылки PPT из старого скрипта
У меня есть необходимость изменить списки ссылок в больших презентациях 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"
Вот пара примеров запуска моего скрипта. Теперь, если у меня другой путь и другое имя файла, потребуется 2 прохода кода с разными "совпадающими" строками (одна с% и одна без%20) в каждом проходе. Если имя файла совпадает, то это будет сделано за один проход кода, но он открывает файлы 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
1-й проход, открывает файлы дважды (предполагают цель и источник), в результате ссылка пропускает% 20, но путь или имя файла не изменяются:
\\aFolder\bFolder\Reports\daily report generator.xlsm!Site Completions!R2C2:R17C17
Измените первый элемент массива (исходный путь) и запустите код 2 раза. На этот раз строка совпадения такая же, за исключением%20. Опять же, он открыл 2 файла за этот проход, на этот раз он изменил путь и имя файла:
\\aFolder\bFolder\Reports\Rpt-Other\daily report generator2.xlsm!Site Completions!R2C2:R17C17
2-й пример, имена файлов одинаковые, только изменения пути. Ни один файл не открыт. Есть только одна ссылка для обновления.
Оригинальная ссылка:
file:///\\aFolder\bFolder\Reports\daily%20report%20generator.xlsm!Site%20Completions!R2C2:R17C17
проход 1 открывает файл 4 раза, но не выполняет 2 запуска скрипта, как это было в примере 1, в результате:
\\aFolder\bFolder\Reports\Rpt-Other\daily report generator.xlsm!Site Completions!R2C2:R17C17
Ничего страшного, но стоит отметить: если я сохраню файл, ссылки не изменятся, но если я сохраню, закрою заново, PPT добавит файл:/// и% 20 вернется к исходным ссылкам.
Похоже, HTMLizing имен файлов изменил способ его работы. И это приводит к тому, что файлы открываются 4 раза по ссылке. По-видимому, дважды на источник и цель.
Хуже всего то, что в первом примере, который изменяет как имя файла, так и путь, мне нужно дважды запустить скрипт, изменив строку "источник / совпадение" с "на" без "%20", чтобы добиться успеха.
Кто-нибудь знает, как это исправить?
26.01.17: отредактированы некоторые для лучшего форматирования и ясности.