2013-07-07 2 views
0

Я делаю простую игру в 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 

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

Благодаря

EDIT: Обновленный код:

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 

Сейчас я получаю сообщение об ошибке во время выполнения: Метод 'OnTime' из object'_Application»не удалось

EDIT:

Открыл это сегодня утром, и он отлично работает.

+4

Я еще не рассматривал ваш вопрос, но весь этот большой раздел кода может быть просто «Range (« AM1: AP20, AP21 »). Formula =" = staticRAND() "' –

+0

Хорошо спасибо. Это имеет смысл и делает его лучше. И работает намного быстрее. – GooberZoober

ответ

2

Ваша процедура NewGame() вызывает StopTimer и более поздние вызовы StartTimer. Все это произойдет намного быстрее, чем 1 секунда, поэтому таймер никогда не останавливается - так что у вас есть два таймера, а затем три, поэтому число увеличивается.

Я считаю, что вам нужно явно отменить предыдущий таймер, используя аргумент Schedule метода OnTime.

expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Вам нужна глобальная переменная для хранения EarliestTime. Это необходимо, чтобы отменить таймер на основе имени как процедуры и ее раннее время:

Dim earliest As Variant 

В вашей процедуре Increment вы установите эту переменную:

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

Затем в вашей процедуре StopTimer, вы можете отменить предыдущий таймер:

Application.OnTime earliest, "Increment", , False 

Там, вероятно, нет необходимости для Counting переменной в настоящее время.

+0

Является ли это то, что вы имеете в виду: 'Sub StopTimer()' ' Counting = false' ' Range ("AH2") = 0' 'Application.OnTime ранний, "Приращение",, false' ' End Sub ' ' Sub Increment() ' ' If Counting Then' 'earliest = Now + TimeValue (" 00:00:01 ")' 'Приложение.OnTime ранний, "Приращение" '' Range ("AH2") = Range ("AH2") + 1' 'Конец If' ' Конец Sub' Потому что я получаю сообщение об ошибке во время выполнения: метод «OnTime 'объекта'_Application' failed – GooberZoober

+0

Я не могу это четко прочесть. Вы можете добавить его к нижней части своего первого сообщения. В любом случае, прежде всего нужно быть глобальной переменной (например, вашей переменной подсчета), и перед тем, как попытаться использовать ее с OnTime, вам необходимо присвоить значение. –

+0

Хорошо, тогда спасибо. Я не мог понять, как сделать его красивым. Я думаю, что я сделал то, что вы имеете в виду, но я не уверен – GooberZoober

Смежные вопросы