wit4r7
wit4r7

Reputation: 135

Countdown can't be cancelled

I have built a small 5 minute Countdown in a UserForm. The countdown should count down. But if the UserForm is closed, the macro should stop and the timer should be reset.

In the UserForm's Terminateevent I have stored the call of my own abort function. This terminates the UserForm, but the timer continues to run in the background and the corresponding macro is always brought to the foreground.

How can the code be modified to stop the timer when the UserForm is closed?

Module 1

Dim Count As Date
Sub callBreak()
    Break.Show
End Sub

Sub Time()
    Count = Now + TimeValue("00:00:01")
    Application.OnTime Count, "minus"
End Sub

Sub minus()
    Dim y As Date
    y = Break.Label1.Caption
    y = y - TimeSerial(0, 0, 1)
    Break.Label1.Caption = y
    If y <= 0 Then
        Break.Label1.Caption = "Arbeit, Arbeit!"
        Exit Sub
    End If
    Call Time
End Sub

Sub abord()
    End
End Sub

Userform:

Sub UserForm_Initialize()
    Call Coffeebreak.Time
End Sub

Sub UserForm_Terminate()
    Call Coffeebreak.abord
End Sub

Upvotes: 1

Views: 48

Answers (2)

FunThomas
FunThomas

Reputation: 29171

One solution: in your module, define a global boolean variable, eg isCancelled. Set this variable to true in abort and check it in minus to prevent that the timer is called again.

Dim Count As Date
Dim isCancelled as Boolean

Sub Time()
    isCancelled = False
    Count = Now + TimeValue("00:00:01")
    Application.OnTime Count, "minus"
End Sub

Sub minus()
    if isCancelled Then Exit Sub
    (...)
End Sub

Sub abort()
   isCancelled = True
End Sub

Upvotes: 2

Joubarc
Joubarc

Reputation: 1216

You can cancel a previously scheduled procedure by setting the optional Schedule argument of Application.OnTime to False. Try this as your Abord() function:

Sub Abord()
    Application.OnTime EarliestTime:=Count, Procedure:="minus", Schedule:=False
End Sub

Upvotes: 2

Related Questions