我的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”。
我希望它在整个会话期间运行,因为我有其他单元格引用此计数器。
非常感谢任何帮助。在寻找解决方案时,我找不到任何类似的问题。
由于
答案 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