2015-03-26 2 views
0

Я хотел бы начать обратный отсчет из работающего кода. Проблема в том, что я заявляюобратный отсчет в пользовательской форме vba, вызванный функцией

> TimerForm.Show 

Тогда отображается форма пользователя, однако обратный отсчет не запускается. Как можно вызвать обратный отсчет просто из функции, где отсчет показан в пользовательском виде TimerLabel, как показано ниже

TimerForm.TimerLabel.Caption = Format(TimeSerial(0, 0, nTime), "hh:mm:ss") & " seconds " 

Ntime будет затем снизился с начальным значением 30 секунд.

Ответ Ниже полностью решается проблема. Кнопка отмены для таймера должна быть

Private Sub CancelTimer_Click() 

Application.OnTime EarliestTime:=earliest, _ 
         Procedure:=handler, _ 
         schedule:=False 
Unload Me 
End 
End Sub 

Если не Application.OnTime продолжает работать в фоновом режиме.

ответ

0

Не знаю, правильно ли поймите вопрос, но вот некоторые из них. НТН

Стандартный код модуля

код модуля класса
Option Explicit 

Public Sub test() 
    ' One possibility with modeless user form 
    ' In this case it is possible to start timer after 
    ' timer form was displayed, because the form is modeless 
    ' TimerForm.Show vbModeless 
    ' TimerForm.StartTimer 

    ' Other possiblity with modal user form 
    ' In this case the StartTimer has to be called 
    ' from inside of user form because the form is modal. 
    TimerForm.Show 
End Sub 

Public Sub TimerElapsed() 
    TimerForm.OnTimerElapsed 
End Sub 

TimerForm

' More info about OnTime: 
' http://www.cpearson.com/excel/ontime.aspx 

Option Explicit 

Private Const interval As Integer = 1 ' second 
Private Const countdownInit As Integer = 30 ' seconds 
Private Const handler As String = "TimerElapsed" 
Private earliest As Double 
Private countdown As Integer 

Private Sub UserForm_Initialize() 
    countdown = countdownInit 
    StartTimer 
End Sub 

Private Sub Cancel_Click() 
    StopTimer 
    Unload Me 
End Sub 

Public Sub StartTimer() 
    earliest = Now + TimeSerial(0, 0, interval) 

    Application.OnTime EarliestTime:=earliest, _ 
         Procedure:=handler, _ 
         Schedule:=True 
End Sub 

Public Sub StopTimer() 
    On Error Resume Next 
    countdown = 0 
    Application.OnTime EarliestTime:=earliest, _ 
         Procedure:=handler, _ 
         Schedule:=False 
End Sub 

Public Sub OnTimerElapsed() 
    If countdown <= 0 Then 
     Me.TimerLabel.Caption = "00:00:00 seconds " 
     Exit Sub 
    End If 

    Dim timerInfo As String 
    timerInfo = Format(TimeSerial(0, 0, countdown), "hh:mm:ss") 
    Me.TimerLabel.Caption = timerInfo & " seconds " 
    countdown = countdown - interval 

    StartTimer ' <--- 'How can I trigger a countdown simply 
       ' from a function where the countdown is shown 
       ' in the user form TimerLabel ...' 
       ' Here the OnTime is re-scheduled for next call. 
End Sub 
+0

Благодаря @dee - я не очень понимаю понятие'vbModeless' –

+0

В коде TimerForm я просмотрел кнопку отмены с помощью «Private Sub CancelTimer_Click()» Содержимое должно быть простым: «Разгрузить Me Конец». Однако, если я использую это, программа имеет очень странное поведение - код начинает переключать между пользовательским кодом и объектом userform ... –

+0

Поскольку я не был уверен, что вам нужно, я добавил эту «немодальную» возможность. Точка безмодельной User-Form заключается в том, что после отображения формы может быть вызвана какая-то публичная функция User-Form. но вы можете игнорировать его, это не имеет отношения к делу. – dee