为了在 Powerpoint 中使用 SlideShowBegin 事件,您必须按以下方式配置类模块:
Public WithEvents App As Application
Private Sub App_SlideShowBegin(ByVal Wn As SlideShowWindow)
MsgBox "SlideShowBegin"
End Sub
然后,在非类模块内部,您必须创建该类型的对象并将 App 设置为 Application。
Dim X As New Class1
Sub InitializeApp()
Set X.App = Application
End Sub
现在,我遇到的唯一问题是,如果您不使用 Powerpoint 中的宏菜单手动调用 InitializeApp,则事件将不起作用。您必须先调用此子项,然后才能在幻灯片开始时调用任何内容(包括此子项)。
如何在运行我的幻灯片之前调用此子程序?有更好的方法吗?
编辑:
我尝试过使用 Class_Initialize 但只有在第一次使用它或者你做出像
Dim X as Class1; X = new Class1
这样的声明时才会被调用
事件处理程序通常作为加载项的一部分安装,您可以在 Auto_Open 子例程中初始化该类,该子例程始终在加载项加载时运行。如果您想在单个演示文稿中包含事件处理程序,使其初始化的一种方法是包含一个形状,当鼠标悬停在该形状上或单击该形状时,会触发一个宏,该宏会初始化您的事件处理程序并转到下一张幻灯片。
回答一个老问题,但我希望我的解决方案可以帮助最终解决这个问题的人。
针对此问题的一般建议是使用插件或在幻灯片上放置某些元素,然后在单击或悬停时执行初始化。两者并不总是理想的,所以我有以下方法:
在某些模块中:
Dim slideShowRunning As Boolean
-----------------------------
Sub SlideShowBegin(ByVal Wn As SlideShowWindow)
' Your code for start-up
End Sub
-----------------------------
Public Sub OnSlideShowPageChange(ByVal Wn As SlideShowWindow)
If TypeName(slideShowRunning) = "Empty" Or slideShowRunning = False Then
slideShowRunning = True
SlideShowBegin Wn
End If
End Sub
----------------------------
Public Sub OnSlideShowTerminate(ByVal Wn As SlideShowWindow)
slideShowRunning = False
End Sub
对我来说这非常有效。 注意 我绝不是一个vba专家,实际上我的vba编程时间可能还不到50小时(在powerpoint中可能只有8小时)。所以这可能是一个可怕的解决方案。我不知道,但对我来说它有效,所以我喜欢分享。
事实上,OnSlideShowPageChange 在幻灯片开始时运行。如果不需要使用全局变量,只需确保它在后续页面更改中不起作用即可。详情请参阅 C. Binair 的回答。