我创建了一个 powerpoint 宏,用于在幻灯片放映开始时运行批处理文件。这是我的代码
Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow)
If SSW.View.CurrentShowPosition = _
SSW.Presentation.SlideShowSettings.StartingSlide Then
Dim argh As Double
argh = Shell("D:\test.bat", vbNormalFocus)
End If
End Sub
我的问题是,关闭并打开 PowerPoint 并运行幻灯片后,批处理文件无法运行。打开幻灯片后,我按 Alt+F11,然后返回 PowerPoint,然后运行幻灯片加载宏并运行批处理文件。我想在启动时在 PowerPoint 上加载宏。有什么想法我犯了什么错误吗?
答案1
我做过很多 VBA 但没有用过 PowerPoint,所以我没有完整的答案。
但是,我可以看到您正在尝试检测幻灯片切换事件,然后将操作限制为仅第一张幻灯片。我怀疑问题在于,在启动时,幻灯片切换事件不会触发。因此,除非您从第二张幻灯片向后移动到第一张幻灯片,否则您永远不会看到幻灯片切换 + 第一张幻灯片的组合。显然,您可以通过转到第二张幻灯片然后返回第一张幻灯片来轻松证明这一点。
您想要的事件称为幻灯片放映开始。
更新:开始SlideShowBegin
工作比简单的子程序稍微复杂一些,因为它需要引用类application
。但是,下面的操作确实可以按您希望的方式工作。
Sub OnSlideShowPageChange()
Dim i As Integer
i = ActivePresentation.SlideShowWindow.View.CurrentShowPosition
If i <> 1 Then Exit Sub
' Insert any code you want activated on slide 1 after here
MsgBox "This is slide 1"
End Sub
要使用其他方法,您首先需要在普通模块中添加以下内容:
选项
Option Explicit
' Class1 is the name of the class module you create
Dim X As New Class1
Sub InitializeApp()
Set X.App = Application
End Sub
然后您需要添加一个类模块(在这个例子中必须称为 Class1),其内容如下:
Option Explicit
Public WithEvents App As Application
Private Sub App_SlideShowBegin(ByVal Wn As SlideShowWindow)
Dim argh As Double
Debug.Print "Slideshow started"
argh = Shell("D:\test.bat", vbNormalFocus)
End Sub
显然第一个例子更容易使用!
更新2:
我确实说过我没有在 PP 中使用 VBA!我发现除非您从插件访问代码,否则 PP 没有 VBA 自动启动功能。让事情正常工作的最简单方法是更改代码(在普通模块中而不是类模块中),以包含一行来实际启动幻灯片放映。
然后从开发人员工具栏调用该宏(或使用宏创建您自己的工具栏),以便它启动幻灯片放映并调用您的代码。