我正在创建一个Powerpoint插件。我想限制用户:
我使用this tutorial/overview来捕获NewPresentation
和PresentationOpen
事件。在用户可以与之交互之前,我想关闭通过这些事件初始化的任何演示文稿。当我尝试使用.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
我收到以下错误。
有关为何发生这种情况的任何想法?或者我可以做些什么来结束这些演示?
答案 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)