当改变其他细胞时,Vba秒表无意中重置0

时间:2016-11-19 15:27:45

标签: excel vba excel-vba excel-2007 stopwatch

我的Excel电子表格中有一个VBA秒表,代码:

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”。

我希望它在整个会话期间运行,因为我有其他单元格引用此计数器。

非常感谢任何帮助。在寻找解决方案时,我找不到任何类似的问题。

由于

1 个答案:

答案 0 :(得分: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