计时器重新启动时,计数器递增

我在Excel中做了一个简单的游戏,我有一个计时器,但每次点击重新生成一个新的游戏时,计时器的计数增加一个。 例如打开时每秒钟上升一次,但是当我重新设置游戏时,它会以两位数来计算,如果我再次重新设置,则按三次计数。

这是生成新游戏的代码:

Dim Counting As Boolean Sub New_Game() ' ' New_Game Macro ' Generates a new game ' ' Keyboard Shortcut: Ctrl+n ' Call StopTimer Range("C6:K14").Select Selection.ClearContents Range("AM1").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM2").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM3").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM4").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM5").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM6").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM7").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM8").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM9").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM10").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM11").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM12").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM13").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM14").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM15").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM16").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM17").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM18").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM19").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AM20").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN1").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN2").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN3").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN4").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN5").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN6").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN7").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN8").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN9").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN10").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN11").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN12").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN13").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN14").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN15").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN16").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN17").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN18").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN19").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AN20").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO1").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO2").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO3").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO4").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO5").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO6").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO7").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO8").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO9").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO10").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO11").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO12").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO13").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO14").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO15").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO16").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO17").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO18").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO19").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AO20").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP1").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP2").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP3").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP4").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP5").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP6").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP7").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP8").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP9").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP10").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP11").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP12").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP13").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP14").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP15").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP16").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP17").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP18").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP19").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP20").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("AP21").Select ActiveCell.FormulaR1C1 = "=staticRAND()" Range("A1").Select Call StartTimer End Sub Sub StartTimer() Counting = True Call Increment End Sub Sub StopTimer() Counting = False Range("AH2") = 0 End Sub Sub Increment() If Counting Then Application.OnTime (Now + TimeValue("00:00:01")), "Increment" Range("AH2") = Range("AH2") + 1 End If End Sub 

如果有人需要了解正在发生的事情,我可以发送该文件。

谢谢

编辑:更新的代码:

 Dim Counting As Boolean Dim earliest As Variant Sub New_Game() ' ' New_Game Macro ' Generates a new game ' ' Keyboard Shortcut: Ctrl+n ' Call StopTimer Range("C6:K14").Select Selection.ClearContents Range("AM1:AP20,AP21").Formula = "=staticRAND()" Range("C6").Select Call StartTimer End Sub Sub StartTimer() 'Counting = True Call Increment End Sub Sub StopTimer() 'Counting = False Range("AH2") = 0 Application.OnTime earliest, "Increment", , False End Sub Sub Increment() 'If Counting Then earliest = Now + TimeValue("00:00:01") Application.OnTime earliest, "Increment" Range("AH2") = Range("AH2") + 1 'End If End Sub 

现在我得到了一个运行时错误:object'_Application的方法'OnTime'失败

编辑:

今天早上打开它,它完美的作品。

您的NewGame()过程调用StopTimer,稍后调用StartTimer。 这会比1秒快得多,所以定时器永远不会停止 – 所以你有两个定时器运行,然后是三个,这就是为什么这个数字会增加。

我相信你需要使用OnTime方法的Schedule参数显式取消前一个定时器。

expression式.OnTime(最早的时间,过程,最新的时间,时间表)

您需要一个全局variables来存储EarliestTime 。 根据过程的名称和最早的时间来取消定时器是必要的:

 Dim earliest As Variant 

在您的增量过程中,您设置了这个variables:

 earliest = Now + TimeValue("00:00:01") Application.OnTime earliest, "Increment" 

然后,在您的StopTimer过程中,您可以取消以前的计时器:

 Application.OnTime earliest, "Increment", , False 

现在可能不需要Countingvariables。