PowerPoint 2013 宏在关闭命令后保持文件锁定打开
PowerPoint 2013 macro keeps file locked open after close command
我有一个 PowerPoint VBA 功能,可以打开演示文稿,将幻灯片复制到活动演示文稿中,然后关闭源演示文稿。它在 2010 年运行良好,但在 2013 年(全部在 Windows 7)尝试多次打开同一演示文稿时失败。在我看来,发出 presentation.close 命令后,window 关闭,但文件保持锁定打开状态,直到 VBA 代码退出。因此,如果代码尝试再次打开该文件,它会 returns 错误:
"Method 'Open' of object 'Presentations' failed"
这是我 运行 函数的简化形式,其行为方式相同。我让一位同事在 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 代码。我还通过添加检查文件打开状态的功能来验证文件是否保持打开状态。
我大概花了一个小时在谷歌上搜索这个问题,但找不到关于这个问题的任何其他描述。我确定我可以实施解决方法,但我找不到任何其他关于看似如此简单问题的报告,这让我很抓狂。非常感谢任何建议!谢谢
我实现此目的的最佳方法是简单地创建一个 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 文件中,并让它复制所需的幻灯片。
希望这可以帮助您实现目标。
将文件设置为只读解决了该问题。打开命令现在是:
Set ppFile = Application.Presentations.Open(fpath, msoTrue)
另外,在关闭文件之前保存文件解决了这个问题。为此,添加:
ppFile.Save
有趣的是,我已经尝试将 Saved 属性 设置为 True (ppFile.Saved = msoTrue),但这不起作用。感谢 Michael 对 VBS 脚本的建议。这确实有效,而且我从来没有 运行 外部 VBS 脚本,所以我学到了一些新东西。在这种情况下,我宁愿坚持使用 VBA 解决方案。
我有一个 PowerPoint VBA 功能,可以打开演示文稿,将幻灯片复制到活动演示文稿中,然后关闭源演示文稿。它在 2010 年运行良好,但在 2013 年(全部在 Windows 7)尝试多次打开同一演示文稿时失败。在我看来,发出 presentation.close 命令后,window 关闭,但文件保持锁定打开状态,直到 VBA 代码退出。因此,如果代码尝试再次打开该文件,它会 returns 错误: "Method 'Open' of object 'Presentations' failed"
这是我 运行 函数的简化形式,其行为方式相同。我让一位同事在 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 代码。我还通过添加检查文件打开状态的功能来验证文件是否保持打开状态。
我大概花了一个小时在谷歌上搜索这个问题,但找不到关于这个问题的任何其他描述。我确定我可以实施解决方法,但我找不到任何其他关于看似如此简单问题的报告,这让我很抓狂。非常感谢任何建议!谢谢
我实现此目的的最佳方法是简单地创建一个 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 文件中,并让它复制所需的幻灯片。
希望这可以帮助您实现目标。
将文件设置为只读解决了该问题。打开命令现在是:
Set ppFile = Application.Presentations.Open(fpath, msoTrue)
另外,在关闭文件之前保存文件解决了这个问题。为此,添加:
ppFile.Save
有趣的是,我已经尝试将 Saved 属性 设置为 True (ppFile.Saved = msoTrue),但这不起作用。感谢 Michael 对 VBS 脚本的建议。这确实有效,而且我从来没有 运行 外部 VBS 脚本,所以我学到了一些新东西。在这种情况下,我宁愿坚持使用 VBA 解决方案。