我正在制作我的第一个Powerpoint 2007宏,我遇到了一些麻烦,并且不让我继续下一张幻灯片。我可以按ESCAPE退出幻灯片,但按空格键或其他任何内容都不会进入下一张幻灯片。过了一会儿,它只是崩溃了。我来自C ++ / Java背景,所以我认为它只是我缺少的基本内容。
基本上我正在尝试制作计数器幻灯片,计算特定日期的天/分/秒。当幻灯片加载时,我希望它实时显示自该日期起多长时间。我已经通过一个无限循环,它可以很好地更新时间,但然后不让我继续下一张幻灯片。
这是我的代码:
Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow)
'If SSW.View.CurrentShowPosition = 3 Then
Do While SSW.View.CurrentShowPosition = 3 ' infinite loop
Dim currentSlide As Integer
currentSlide = SSW.View.CurrentShowPosition
Dim startDate As Date
Dim currentDate As Date
Dim sngDiff As Single
Dim lngDays As Long
Dim lngHours As Long
Dim lngMinutes As Long
Dim lngSeconds As Long
startDate = #7/22/2011 2:00:00 PM#
currentDate = Now
sngDiff = currentDate - startDate
lngDays = CLng(sngDiff)
sngDiff = sngDiff - lngDays
lngHours = Hour(sngDiff)
lngMinutes = Minute(sngDiff)
lngSeconds = Second(sngDiff)
With ActivePresentation.Slides(currentSlide)
With .Shapes(2)
.TextFrame.TextRange.Text = "It has been:" & lngDays & " Days " & lngHours & " hours " & lngMinutes & " minutes " & lngSeconds & " Seconds"
End With
End With
DoEvents
Loop
End Sub
我是否需要侦听某种按钮点击以停止此无限循环,或者我该如何做?
感谢。
答案 0 :(得分:0)
为了在VBA上下文中执行时间延迟,通常最好使用form_timer对象,因此在代码中有:
If SSW.View.CurrentShowPosition = 3 Then
Me.TimerInterval = 1000
Else
Me.TimerInterval = 0
End If
或类似的东西。然后在表格中定时器代码有你的时钟更新代码
Private Sub Form_Timer()
// Your clock update code here
End Sub
自从我做了任何VBA以来已经好几年了,所以我有点生疏,但我希望这会有所帮助。通常使用计时器代替循环来处理线程任务,VBA并不能很好地应对它们。
答案 1 :(得分:0)
问题是你的例程“拥有”应用程序;直到它退出,您将无法手动执行任何操作(即,前进到下一张幻灯片)。
无论你是否在表单上使用计时器(并且fwiw,Timer控件不随VB一起提供VBA),我认为表单可能是你的解决方案。
让您的事件处理程序无模式加载表单然后退出。
然后,表单中的代码可以对幻灯片或任何您想要的其他内容进行修改。 经常包含DoEvents,以免您减慢主应用程序的速度,但表单中的代码将独立于主应用程序的运行。
您无需使表单可见(也可能不想)。
答案 2 :(得分:0)
用户表单是您在VBA编辑器中添加的内容;这是你通常认为的对话框,虽然表格可以用于其他事情,甚至不需要变得可见;这就是我们在这里要做的事情:
Option Explicit
Public bFormCodeRunning As Boolean
Sub FormDemo()
' Set a flag to let us know the code in the form
' is running
bFormCodeRunning = True
' "show" the form
UserForm1.Show vbModeless
End Sub
Sub KillForm()
' call this at some other point in the presentation
' when you're sure you're done running the form code
If Not bFormCodeRunning Then
Unload UserForm1
End If
' You could actually call this from your slide change event handler
End Sub
然后从菜单中插入,用户表单添加新表单;双击它以查看其代码并添加:
Private Sub UserForm_Activate()
' Don't show my face
Me.hide
DoEvents
' prove that the form's loaded
MsgBox "I'm well-formed"
DoEvents
' and put your other code here
' and when the code's done, flag it
bFormCodeRunning = False
End Sub