Проблемы с поиском / заменой ссылок OLE - PullRequest
0 голосов
/ 07 января 2019

Я разрабатываю шаблон на основе Excel для прямой связи с соответствующим шаблоном Powerpoint, и в процессе обнаружил изменение относительного связывания MS по умолчанию с родительским каталогом (оставив связанные файлы в одной папке, можно их переместить / скопировать / etc и ссылки будут обновлены).

Я пробовал несколько решений в 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, можно ли передать переменные из листа Excel в PowerPoint VBA?

1 Ответ

0 голосов
/ 23 января 2019

Хотя я не смог заставить этот макрос работать в PPT, я выкладываю решение, которое использую вместо этого. Я успешно использовал поиск / замену в блокноте, когда PPT сохранен в виде XML (обновление размера слайда без растягивания изображения), поэтому смог реплицировать и автоматизировать тот же процесс через PowerShell.

Единственный нюанс в том, что я вызываю скрипт PowerShell через файл Excel, который я связываю с PPT через VBA; причина в том, что я могу передать информацию о пути к файлу / имени файла с рабочего листа и избежать необходимости ввода данных пользователем. Ниже приведен сценарий PS:

param(
[string]$ReplaceStr_1,
[string]$ReplaceStr_2,
[string]$ReplaceStr_3,
[string]$OUTPUTfilepath)

[string]$FindStr_1,
[string]$FindStr_2,
[string]$FindStr_3,

[String]$templatefile



$FindStr_1 = "C:\Reports%20Folder\template\NewReportTemplate001.xlsm"
$FindStr_2 = "C:\Reports Folder\template\NewReportTemplate001.xlsm"
$FindStr_3 = "[NewReportTemplate001.xlsm]"

$templatefile = "C:\Reports Folder\_MasterData\NewReportPresentation.xml"

Get-Content $templatefile | 
Foreach-Object { 
$_ -Replace [regex]::Escape($FindStr_1), $ReplaceStr_1 `
   -Replace [regex]::Escape($FindStr_2), $ReplaceStr_1`
   -Replace [regex]::Escape($FindStr_3), $ReplaceStr_3
} | Set-Content $OUTPUTfilepath
echo $OUTPUTfilepath

[Environment]::Exit(1)

Для получения дополнительной информации я использую функцию CELL ("имя файла",), чтобы генерировать мои динамические пути к файлам для передачи в параметры PS выше.

Ниже приведен макрос VBA для справки:

Sub BuildISLxmlPPT()
    Dim FR1 As String
    Dim FR2 As String
    Dim FR3 As String
    Dim psOUT As String

    FR1 = Range("xmlFR1").Value
    FR2 = Range("xmlFR2").Value
    FR3 = Range("xmlFR3").Value
    vbaOUT = Range("xmlOUT").Value

    strCommand = "Powershell -noprofile -File ""C:\Reports Folder\_MasterData\FindReplacePPTXML.ps1"" -psFR1 """ & FR1 & """ -psFR2 """ & FR2 & """ -psFR3 """ & FR3 & """ -OUTPUT """ & vbaOUT & """"

    Set WshShell = CreateObject("WScript.Shell")
    Set WshShellExec = WshShell.exec(strCommand)
    strOutput = WshShellExec.StdOut.ReadAll

    MsgBox "New PPT.xml file generated here: " & strOutput, _
    Buttons:=vbInformation, _
    Title:="Perfection"
...