2016-11-19 8 views
0

У меня есть Секундомер VBA в моей таблице Excel, код:Vba Секундомер unintendently сбрасывается назад 0 при изменении других клеток

Public StopIt As Boolean 
Public ResetIt As Boolean 
Public LastTime 
Private Sub CommandButton1_Click() 
Dim StartTime, FinishTime, TotalTime, PauseTime 
StopIt = False 
ResetIt = False 
If Range("C2") = 0 Then 
    StartTime = Timer 
    PauseTime = 0 
    LastTime = 0 
Else 
    StartTime = 0 
    PauseTime = Timer 
End If 
StartIt: 
    DoEvents 
    If StopIt = True Then 
    LastTime = TotalTime 
    Exit Sub 
    Else 
    FinishTime = Timer 
    TotalTime = FinishTime - StartTime + LastTime - PauseTime 
    TTime = TotalTime * 100 
    HM = TTime Mod 100 
    TTime = TTime \ 100 
    hh = TTime \ 3600 
    TTime = TTime Mod 3600 
    MM = TTime \ 60 
    SS = TTime Mod 60 
    Range("C2").Value = Format(hh, "00") & ":" & Format(MM, "00") & ":" & Format(SS, "00") & "." & Format(HM, "00") 
    If ResetIt = True Then 
     Range("C2") = Format(0, "00") & ":" & Format(0, "00") & ":" & Format(0, "00") & "." & Format(0, "00") 
     LastTime = 0 
     PauseTime = 0 
     End 
    End If 
    GoTo StartIt 
    End If 
End Sub 
Private Sub CommandButton2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    StopIt = True 
End Sub 
Private Sub CommandButton3_Click() 
    Range("C2").Value = Format(0, "00") & ":" & Format(0, "00") & ":" & Format(0, "00") & "." & Format(0, "00") 
    LastTime = 0 
    ResetIt = True 
End Sub 

Этот секундомер работает правильно. Моя проблема в том, что когда я меняю ячейку в своей таблице или вношу какие-либо изменения, она сбрасывает секундомер на «0».

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

Любая помощь была бы принята с благодарностью. Я не мог найти подобных проблем при поиске решения.

Благодаря

+0

Какое значение сбрасывается до 0? У вас есть код в обработчике событий Worksheet_Change? – Comintern

+1

Что вы хотите, если этот код вызывается во второй раз, а секундомер в данный момент активен? Вы хотите разрешить запуск нескольких секундомеров? Я предполагаю, что, как минимум, вам нужен флаг, чтобы указать «HeyImActive». –

+0

@ WayneG.Dunn - Да, только что заметил. Если щелкнуть CommandButton1, когда он «работает», он перезапускается с последнего раза, когда он был остановлен. – Comintern

ответ

1

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

Когда я проверяю ваш код, запуская таймер, а затем меняя любую ячейку, он не сбрасывается до нуля, но останавливает таймер. Глядя на код, который у вас есть (который, возможно, пришел от https://www.extendoffice.com/documents/excel/3684-excel-create-stopwatch.html), код хорош только для использования простого таймера ... ничего другого. И так как он никогда не отказывается от контроля, пока вы его не прекратите, он использует огромную часть вашего процессора (см. Диспетчер задач!)

Я нашел код здесь, на стеке VBA Macro On Timer style to run code every set number of seconds, i.e. 120 seconds и использовал второй ответ (просто слишком ленивый использовать первый ответ при запуске).

Теперь вы можете изменять ячейки, и код продолжает работать (кроме того, что он «приостанавливается», пока выполняется изменение в ячейке). Вам может не понравиться тот факт, что он увеличивается на несколько секунд, но, возможно, кто-то еще знает об этом.

Код НЕ входит в листовой модуль.

Option Explicit 

Dim TimerActive As Boolean 
Sub StartTimer() 
    Start_Timer 
End Sub 

Private Sub Start_Timer() 
    TimerActive = True 
    Application.OnTime Now() + TimeValue("00:00:01"), "Timer" 
End Sub 

Private Sub Stop_Timer() 
    TimerActive = False 
End Sub 

Private Sub Timer() 
    If TimerActive Then 
     Activesheet.Cells(2, 3).value = Time 
     Application.OnTime Now() + TimeValue("00:00:01"), "Timer" 
    End If 
End Sub 
+0

Спасибо за этот Уэйн. – user6840188