Powerpoint VBA 应用程序_SlideShowBegin

问题描述 投票:0回答:3

为了在 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

这样的声明时才会被调用
events vba powerpoint
3个回答
1
投票

事件处理程序通常作为加载项的一部分安装,您可以在 Auto_Open 子例程中初始化该类,该子例程始终在加载项加载时运行。如果您想在单个演示文稿中包含事件处理程序,使其初始化的一种方法是包含一个形状,当鼠标悬停在该形状上或单击该形状时,会触发一个宏,该宏会初始化您的事件处理程序并转到下一张幻灯片。


1
投票

回答一个老问题,但我希望我的解决方案可以帮助最终解决这个问题的人。

针对此问题的一般建议是使用插件或在幻灯片上放置某些元素,然后在单击或悬停时执行初始化。两者并不总是理想的,所以我有以下方法:

在某些模块中:

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小时)。所以这可能是一个可怕的解决方案。我不知道,但对我来说它有效,所以我喜欢分享。


0
投票

事实上,OnSlideShowPageChange 在幻灯片开始时运行。如果不需要使用全局变量,只需确保它在后续页面更改中不起作用即可。详情请参阅 C. Binair 的回答。

© www.soinside.com 2019 - 2024. All rights reserved.