查找/替换OLE链接的问题

时间:2019-01-07 16:01:55

标签: vba powerpoint powerpoint-vba

我正在开发一个基于Excel的模板以直接与相应的Powerpoint模板链接,并且在此过程中,通过默认设置为父目录,MS的相对链接发生了变化(将链接文件保留在同一文件夹中意味着可以移动它们/复制/等,链接将会更新)。

我已经尝试了Excel VBA中的少数解决方法,并且当前唯一可行的选择包括将PPT保存为XML文件,然后使用传入的变量构造的新文件路径对旧文件路径进行查找/替换(PowerShell)。从Excel文件中获取。

子ChangeOLELinks()

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

上面的代码运行并确实更新了链接,但只有一部分。我的PPT包含直接来自工作表和图表的链接的“网格”,并且无论出于何种原因,下面的代码都只会更新网格。

即使有解决方案来更新所有形状/ OLE对象,我是否仍可以通过Powerpoint VBA中的Excel工作表传递变量?

1 个答案:

答案 0 :(得分:0)

虽然我无法在PPT中使此宏充分发挥作用,但我正在发布我正在使用的解决方案。当PPT另存为XML时(在不进行图像拉伸的情况下进行幻灯片尺寸更新),因此我在记事本中成功使用了查找/替换功能,因此能够通过PowerShell复制并自动执行相同的过程。

唯一的区别是,我通过通过VBA链接到PPT的Excel文件调用PowerShell脚本;原因是这样,我可以从工作表中传递文件路径/文件名信息,而无需用户输入。下面是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(“ filename”,)函数生成动态文件路径,以传递到上面的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"