Проблема с построением таймера обратного отсчета в Excel с использованием VBA - PullRequest
0 голосов
/ 20 марта 2019

Я пытался построить таймер обратного отсчета, используя VBA, и результат может быть динамически выведен в ячейку Excel. Я позволил процедуре abc и def рекурсивно вызывать друг друга (не устанавливал точку остановки только для тестирования), и это работало. Однако позже с тем же самым кодом я снова запустился, не удалось, и сообщение об ошибке было:

Выполнение кода было прервано.

Просто не могу понять, почему, я ничего не изменил, как это могло сработать, а потом потерпеть неудачу?

Я пробовал On Error Resume Next и Application.DisplayAlert = False, оба не останавливают всплывающее сообщение об ошибке и прерывание выполнения кода. И если я перейду к процедуре, это будет нормально ...

Также я хочу добавить динамический текст, такой как «начать через сколько секунд», как в комментарии в другой ячейке. Может ли это быть реализовано таким образом?

Спасибо!

Sub abc()

    [a1] = [a1] - 1
    ' [a2] = "Start in " & [a1] & " seconds."
    Call def

End Sub


Sub def()

    Application.Wait (Now + TimeValue("0:00:01"))

    Call abc

End Sub

Ответы [ 3 ]

3 голосов
/ 20 марта 2019

Вместо того, чтобы пытаться сделать это рекурсивно, из-за проблем со стеком вызовов я бы использовал Application.OnTime .

Sub Button1_Click()
    Call MyTimer

End Sub

Sub MyTimer()
    [a1] = [a1] - 1

    Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
End Sub

Я полагаю, что это все еще "рекурсивно" вмода, но процедура выходит каждый раз.Только по истечении 1 секунды он снова выполняет процедуру.

Но, в любом случае, вы должны включить некоторые средства остановки процесса.Например,

Sub MyTimer()
    [a1] = [a1] - 1

    If [a1] > 0 Then
        Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
    End If
End Sub
0 голосов
/ 20 марта 2019

Почему бы не создать функцию кстати?Это работает для вас?

Function wait(seconds As Long)

    Dim originalStatusBar As String, i As Long
    originalStatusBar = Application.StatusBar

    For i = seconds To 0 Step -1
        Application.wait (Now + TimeValue("0:00:01"))
        Application.StatusBar = "Start in " & i & " seconds"
    Next

    Application.StatusBar = originalStatusBar

End Function

Тогда в вашей сабвуфере вы просто называете это так:

wait 5 'waits 5 seconds and updates status bar with remaining time

или

wait [a1]-1
0 голосов
/ 20 марта 2019

Весь ваш код работает нормально для меня (включая часть [a2]). Я нахожусь на Windows 7 с Excel 2013.

Я предлагаю вам включить условие остановки до abc(), как

If [a1] > 0 Then
   Call def
End If

Пожалуйста, предоставьте больше информации.

...