我在 Visual Studio 中使用 VisualBasic 创建了一个 PowerPoint VSTO 加载项,我希望能够使用它复制演示文稿的所有幻灯片,并将它们以其原始格式粘贴到我当前活动的演示文稿中。然而,它并不是很好用。
如果我启动 PowerPoint,创建一个新的空演示文稿,然后单击加载项,它不起作用。如果我处于调试模式,我会收到一个运行时错误,告诉我“Presentation(未知成员):对象不存在。”在
destPPT.Windows.Item(1).Activate()
(我第一次尝试使用destPPT
)。当我继续时,PowerPoint 会打开我想从中复制幻灯片的演示文稿并关闭我激活的幻灯片。
我在 PowerPoint 中找到了两种解决此问题的方法。第一个关闭打开的演示文稿,创建一个新的空演示文稿并再次运行加载项。另一种是修改空演示文稿中的任何内容(如添加一些文本),然后运行加载项。两者似乎都工作正常。
这是我用于此的代码片段
Dim pptApp As Application
Dim destPPT As Presentation
Dim srcPPT As Presentation
pptApp = GetObject([Class]:="PowerPoint.Application")
destPPT = pptApp.ActivePresentation
srcPPT = pptApp.Presentations.Open(srcPath)
srcPPT.Slides.Range().Copy()
destPPT.Windows.Item(1).Activate()
destPPT.Application.CommandBars.ExecuteMso("PasteSourceFormatting")
srcPPT.Close()
我是 Visual Basic 的新手,不知道哪里出了问题,或者我可以用不同的方式做什么,也找不到任何有用的东西。
经过更多的调试和测试,我找到了解决方案。我像以前一样创建了一个新的空演示文稿,但随后打开了我想从中复制幻灯片的演示文稿,而不是使用加载项,而是使用通常的方式(文件 -> 打开)。 PowerPoint 现在再次关闭了空的演示文稿,只打开了新的演示文稿。我想如果您在打开另一个演示文稿时没有对其进行任何操作,PowerPoint 只会关闭任何空演示文稿。但问题不在于演示文稿的实际打开,而在于为其打开一个新窗口。
我现在将
Presentations.Open()
WithWindow As MsoTriState
参数更改为 msoFalse
因此 PowerPoint 在没有新窗口的情况下打开演示文稿,它现在可以按预期工作。
我的代码现在看起来像这样:
Dim pptApp As Application
Dim destPPT As Presentation
Dim srcPPT As Presentation
pptApp = GetObject([Class]:="PowerPoint.Application")
destPPT = pptApp.ActivePresentation
srcPPT = pptApp.Presentations.Open(srcPath, WithWindow:=MsoTriState.msoFalse)
srcPPT.Slides.Range().Copy()
'I dont create a new window, therefore the following line is not needed
'destPPT.Windows.Item(1).Activate()
destPPT.Application.CommandBars.ExecuteMso("PasteSourceFormatting")
srcPPT.Close()
编辑:事实证明,我实际上不再需要激活
destPPT
的窗口,因为它是唯一创建的窗口。