Powerpoint事件处理 - 防止新的演示文稿

时间:2013-04-18 14:36:09

标签: vba add-in powerpoint powerpoint-vba

我正在创建一个Powerpoint插件。我想限制用户:

  • 创建新演示文稿
  • 打开现有演示文稿

我使用this tutorial/overview来捕获NewPresentationPresentationOpen事件。在用户可以与之交互之前,我想关闭通过这些事件初始化的任何演示文稿。当我尝试使用.Close方法关闭它时,我收到一个错误(下面的屏幕截图)。

在我的类模块中,我有以下内容来捕获NewPresentation事件。这很好用,我收到了消息框,Pres是一个有效的Presentation对象,可以传递给CloseNewPres例程。

Private Sub PPTEvent_NewPresentation(ByVal Pres As Presentation)
MsgBox "You cannot use this Charting tool with multiple presentations.", vbInformation
CloseNewPres Pres
End Sub

在标准模块中,我有CloseNewPres例程,我希望关闭“新”演示文稿:

Sub CloseNewPres(Pres As Presentation)
    Application.Presentations(Pres.Name).Close
    'Pres.Close '<~~ This also fails.'
End Sub

我收到以下错误。

Screenshot of error message

有关为何发生这种情况的任何想法?或者我可以做些什么来结束这些演示?

3 个答案:

答案 0 :(得分:3)

在我看来,你需要使用另一个与你使用的事件非常类似的事件:

Private Sub PPApp_AfterNewPresentation(ByVal Pres As Presentation)

如果我在提议的内容中设置了Pres.Close,那么它确实关闭了新创建的演示文稿。

答案 1 :(得分:1)

我所拥有的最好的解释(这是我自己的解释)是因为你在事件处理程序处理它时试图删除一个对象(表示),所以它正在吠叫。有点要求事件处理人员从自己的脚下拉出地毯。

顺便说一下,从事件处理程序中调用另一个例程并让IT做事情是行不通的,因为事件处理程序仍处于活动状态。

解决这个问题的方法之一:

让事件处理程序无模式加载表单。 执行此操作时,事件处理程序中的其余代码将运行完成。 如果符合条件,表单的初始化代码可以关闭演示文稿。

这种形式不需要为此起作用。

是的。看起来奇怪。但它确实有效。

答案 2 :(得分:1)

在C#.Net中,您可以通过这种方式完成

using pp = Microsoft.Office.Interop.PowerPoint;

pp.Application ppApp = Globals.ThisAddIn.Application;
ppApp.AfterNewPresentation += Event_PresNew;

public void Event_PresNew(pp.Presentation ppPres)
{
//.....your code here....
}

此外,您还可以在下面的幻灯片中看到可以在Powerpoint中使用的所有事件的列表, https://docs.microsoft.com/en-us/office/vba/api/powerpoint.application.newpresentation(even)