Powerpoint宏 - 计数器的基本问题

时间:2011-07-24 00:51:15

标签: vba powerpoint

我正在制作我的第一个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

我是否需要侦听某种按钮点击以停止此无限循环,或者我该如何做?

感谢。

3 个答案:

答案 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