Хотя я не смог заставить этот макрос работать в 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"