Vba 如何停止对应用程序的调用。退出导致弹出框?

Vba 如何停止对应用程序的调用。退出导致弹出框?,vba,error-handling,exit,Vba,Error Handling,Exit,我正在编写一个VBA宏,它从Excel工作簿中获取数据,并根据数据创建PowerPoint演示文稿。我使用变量名ppa和ppt分别表示PowerPoint应用程序和演示文稿 Dim ppa As PowerPoint.Application Dim ppt As PowerPoint.Presentation Set ppa = CreateObject("PowerPoint.Application") Set ppt = ppa.Presentations.Open(oldFileName)

我正在编写一个VBA宏,它从Excel工作簿中获取数据,并根据数据创建PowerPoint演示文稿。我使用变量名ppa和ppt分别表示PowerPoint应用程序和演示文稿

Dim ppa As PowerPoint.Application
Dim ppt As PowerPoint.Presentation
Set ppa = CreateObject("PowerPoint.Application")
Set ppt = ppa.Presentations.Open(oldFileName)
将所有数据放入PowerPoint文件后,我得出以下结论:

ppt.SaveAs(newFileName)
ppt.Close
Set ppt = Nothing
ppa.Quit
Set ppa = Nothing
控件命中语句时:

ppa.Quit
,我得到一个弹出框,内容如下:

Microsoft PowerPoint已停止工作。一个问题导致程序停止正常工作。请关闭程序

更糟糕的是,有时文件以新文件名保存,有时则不是。如何修改代码以阻止这种情况发生?

编辑:

在Mat的Mug评论之后,我运行了您的代码,发现即使您关闭了上一个演示文稿,实际上也有powerpoint应用程序可供退出

我发现,应用程序似乎真的退出了,然后突然弹出。这种行为可能有一个合乎逻辑的解释

所以,您需要做的是等待1秒退出应用程序:

ppt.Close
Set ppt = Nothing
Application.Wait (Now + TimeValue("00:00:01"))
ppa.Quit
Set ppa = Nothing
或在演示结束后重新创建ppa对象

ppt.Close
Set ppt = Nothing
Set ppa = CreateObject("PowerPoint.Application")
ppa.Quit
Set ppa = Nothing
这两个选项是解决崩溃问题的变通方法

Edit2:

上述解决方案对我来说效果不错,但如果您仍然有问题,可以像这样直接退出powerpoint:

ppt.SaveAs(newFileName)
ppa.Quit
Set ppa = Nothing
编辑:

在Mat的Mug评论之后,我运行了您的代码,发现即使您关闭了上一个演示文稿,实际上也有powerpoint应用程序可供退出

我发现,应用程序似乎真的退出了,然后突然弹出。这种行为可能有一个合乎逻辑的解释

所以,您需要做的是等待1秒退出应用程序:

ppt.Close
Set ppt = Nothing
Application.Wait (Now + TimeValue("00:00:01"))
ppa.Quit
Set ppa = Nothing
或在演示结束后重新创建ppa对象

ppt.Close
Set ppt = Nothing
Set ppa = CreateObject("PowerPoint.Application")
ppa.Quit
Set ppa = Nothing
这两个选项是解决崩溃问题的变通方法

Edit2:

上述解决方案对我来说效果不错,但如果您仍然有问题,可以像这样直接退出powerpoint:

ppt.SaveAs(newFileName)
ppa.Quit
Set ppa = Nothing

我重新创建了您在我的机器上执行的操作,并且能够很好地执行该操作。我怀疑这可能是因为David建议您的代码中存在其他问题,或者您只需要重新启动计算机。查看完整的代码(或者至少足以了解其他正在发生的事情)有助于确定它是哪一个。重新启动可以做到这一点,特别是如果您已经开发此代码并调试实时代码一段时间,您可能无意中创建了许多PPT对象,并且在这些情况下可能会出现内存错误等。从重新启动开始,如果问题仍然存在,让我们看看代码的其余部分。为什么要使用
CreateObject
New
创建早期绑定引用?我在我的机器上重新创建了上面所做的,并且能够很好地执行操作。我怀疑这可能是因为David建议您的代码中存在其他问题,或者您只需要重新启动计算机。查看完整的代码(或者至少足以了解其他正在发生的事情)有助于确定它是哪一个。重新启动可以做到这一点,特别是如果您已经开发此代码并调试实时代码一段时间,您可能无意中创建了许多PPT对象,并且在这些情况下可能会出现内存错误等。从重新启动开始,如果问题仍然存在,让我们看看代码的其余部分。为什么要使用
CreateObject
New
创建早期绑定引用?如果没有powerpoint演示文稿,就没有powerpoint应用程序可退出。-这是相当不直观和完全令人困惑的行为。您完全可以拥有一个
Excel.Application
实例,而不需要打开
工作簿
对象。我对ppt API/对象模型不是很熟悉,但我现在正在查看一个未加载演示文稿的PowerPoint实例,因此我对该语句一点也不确定。@Mat的杯子您似乎是对的,我因您的评论而更改了答案。您能试着增加等待时间吗?为了确保5秒-->“00:00:05”请尝试我的编辑2当我在底部的每个语句上放置断点时,它工作正常。如果没有powerpoint演示文稿,则没有powerpoint应用程序可退出。-这是相当不直观和完全令人困惑的行为。您完全可以拥有一个
Excel.Application
实例,而不需要打开
工作簿
对象。我对ppt API/对象模型不是很熟悉,但我现在正在查看一个未加载演示文稿的PowerPoint实例,因此我对该语句一点也不确定。@Mat的杯子您似乎是对的,我因您的评论而更改了答案。您能试着增加等待时间吗?为了确保它像5秒-->“00:00:05”请尝试我的edit2当我在底部的每个语句上放置断点时,它工作正常。