从外部 C# 应用程序自动化 PowerPoint VBA 加载项

Posted

技术标签:

【中文标题】从外部 C# 应用程序自动化 PowerPoint VBA 加载项【英文标题】:Automate PowerPoint VBA Add-In From External C# Application 【发布时间】:2012-04-05 19:23:33 【问题描述】:

我正在设计一个 C# 应用程序,它将打开一个 PowerPoint 演示文稿,将带有动画的幻灯片拆分为单独的幻灯片,然后将整个演示文稿导出为一系列 JPG 图像。我在 Visual Studio 2010 和 Microsoft Office 2010 中工作。

该项目以PPspliT 为中心,这是另一个开发人员慷慨提供的 VBA 宏和插件,并且运行良好! (谢谢!)本质上,我希望使用外部 C# 应用程序(而不是另一个宏或 Office 加载项)自动执行此加载项。我当前的代码基于a helpful example from Microsoft。如果要转换的 PowerPoint 文件包含 PPspliT_main 宏,则示例中的 RunMacro 函数在这样使用时可以正常工作:

RunMacro(oPP, new Object[]"'pres1.ppt'!PPspliT_main");

但是,如果宏未保存在 PowerPoint 文件本身中,RunMacro 函数的代码将引发 TargetInvocationException,因为宏不存在(即使已安装加载项)。我希望能够利用加载项的功能,以便可以操作任何 PowerPoint 文件,而不仅仅是其中保存了宏的文件。我想有一种简单的方法可以做到这一点。

类似于Application.CommandBars.ExecuteMso("Copy") 的函数似乎正是我所需要的,但从我读过的内容来看,听起来只有内置函数有 idMso,但没有自定义函数(比如这个)。这是真的?或者我可能需要编辑 PPspliT 宏代码本身以“公开”它以便从我的 C# 应用程序中调用它?

我已经进行了大量搜索以寻找解决方案,并且发现了许多与我正在寻找的相似的文章/帖子,但它们似乎都不同,以至于它们不适用于我的情况。我是使用宏/加载项的新手,所以我的术语/理解也可能有点偏离。

任何指导将不胜感激。提前感谢您的帮助!

【问题讨论】:

您是否尝试过使用 PPspliT_main 而不是 pres1.ppt'!PPspliT_main 作为最后一个参数?包含 pres1.ppt 会告诉 PowerPiont 专门在该文件中查找宏,而仅询问宏名称应该允许您调用在加载的加载项中定义的任何公共子或函数。 @SteveRindsberg 啊哈,明白了!既然您指出了这一点,那是完全有道理的(事后看来,这很明显)。在我的实际代码中,我从变量中提取文件名,而不仅仅是硬编码 pres1.ppt。但我不知道那里不需要文件名。非常感谢你的帮助。您介意在答案中重新发布您的评论,以便我可以解决它并支持它吗? (我假设即使我是 *** 的新手,我也可以投票支持其他人对我自己问题的回答?) 很高兴它有帮助。我已将其转发为答案(犹豫是否这样做,因为我不完全确定它会起作用......只有 95% 【参考方案1】:

您需要使用PPspliT_main 而不是pres1.ppt'!PPspliT_main 作为最后一个参数。

包括 pres1.ppt 告诉 PowerPoint 专门在该文件中查找宏,而仅询问宏名称应该允许您调用在加载的加载项中定义的任何公共子或函数。

【讨论】:

以上是关于从外部 C# 应用程序自动化 PowerPoint VBA 加载项的主要内容,如果未能解决你的问题,请参考以下文章

如何将图表从 Excel 复制到 PowerPoint?

使用 Python 将图表从 Excel 转换为 PowerPoint

如何使用C#操作幻灯片

如何使用 C# 2.0 将数据表的内容推送到 powerpoint 幻灯片

在 C# Win Form 中嵌入 PowerPoint Viewer

Sharepoint 2013 管理服务应用程序 - 缺少 PowerPoint 自动化服务