我有一个PowerPoint VBA功能,可以打开演示文稿,将幻灯片复制到活动演示文稿中,然后关闭源演示文稿。它在2010年运行良好,但在2013年(所有在Windows 7上)都失败了,如果它试图多次打开同一个演示文稿。在我看来,在发出presentation.close命令后,窗口关闭,但文件保持锁定状态,直到VBA代码退出。因此,如果代码再次尝试打开该文件,则会返回错误: "方法'打开'对象'演示文稿'失败"
这是我正在运行的功能的简化形式,其行为方式相同。我在PowerPoint 2010中再次让同事对此进行了测试,运行正常。我还有一位同事在2013年对它进行了测试,以确保它与我的特定安装无关。
Sub testopen()
Dim ppFile As Presentation
Dim i As Integer
Const fpath = "C:\test.pptx"
For i = 1 To 2
Set ppFile = Application.Presentations.Open(fpath)
ppFile.Close
Set ppFile = Nothing
Next i
End Sub
文件test.pptx只是一个空白的演示文稿。在调试模式下,我可以看到文件在第一个循环中打开和关闭,然后在第二个循环上打开命令失败,我可以在Windows资源管理器中看到隐藏的临时文件仍然存在,表明文件仍然打开,直到我退出VBA代码。我还通过添加一个函数检查文件打开状态来验证文件是否保持打开状态。
我花了一个小时在Google上搜索,但找不到任何其他有关此问题的说明。我确信我可以实施一种解决方法,但它让我发疯,我无法找到任何其他似乎这么简单问题的报告。任何建议都非常感谢!感谢。
答案 0 :(得分:0)
我实现这一目标的最佳方式是简单地创建一个VBS文件,并在VBS文件中调出所需的VBA代码。这比编写VBA代码更麻烦,但它是适用于我的解决方案。
例如在VBS文件中:
Dim args, objPP
Set args = WScript.Arguments
Set objPP = CreateObject("Powerpoint.Application")
objPP.Open "C:\path\to\file.ppx"
objPP.Visible = True
objPP.Run "The_Macro"
objPP.Save
objPP.Close(0)
objPP.Quit
或者更好的是,将整个代码放在VBS文件中并让它复制所需的幻灯片。
希望这可以帮助您实现结果。
答案 1 :(得分:0)
将文件设置为只读解决了该问题。 open命令现在是:
Set ppFile = Application.Presentations.Open(fpath, msoTrue)
此外,在关闭文件之前保存文件解决了问题。为此,添加:
ppFile.Save
有趣的是,我已经尝试将Saved属性设置为True(ppFile.Saved = msoTrue),这不起作用。感谢Michael对VBS脚本的建议。这确实有效,我从未运行过外部VBS脚本,因此我学到了一些新东西。在这种情况下,我更愿意坚持使用VBA解决方案。