我正在开发一个基于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工作表传递变量?
答案 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"