Макрос Excel VBA OnTime запускается несколько раз

У меня есть простой код, который копирует текущую стоимость моего портфеля акций и вставляет ее в таблицу. Недавно я попытался добавить таймер, чтобы он делал это автоматически каждый час. Однако это работает, оно вставляет значение четыре или пять раз в таблицу. Я искал вокруг, и я думаю, что это может быть потому, что для запуска макроса требуется всего доля секунды, и поэтому он зацикливается, пока не пройдет целая секунда.

Вот код:

Sub AutoPL()
    Worksheets("Overview").Range("C15:D15").Copy
    Worksheets("Data").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial                     xlPasteValues
    Application.CutCopyMode = False
    Call PLTimer
End Sub


Sub PLTimer()
    Application.OnTime Now + TimeValue("01:00:00"), "AutoPL"
End Sub

person mclapham    schedule 13.09.2017    source источник
comment
Вы можете добавить общедоступные intLastHrRun, intLastMinuteRun и intLastSecondRun, а затем сравнить значения time с этим, и если другой час, который, я полагаю, это все, что вам действительно нужно, тогда запустите, если тот же час, то не делайте этого. Или установите ` Now + TimeValue (01:00:00) ` в переменную, а затем отмените время включения после запуска на это время, а затем сбросьте в PLTimer.   -  person Nathan_Sav    schedule 13.09.2017
comment
@Nathan_Sav Было бы лучше сделать Dim TimeLastRun as Double, так как это будет очень точно по сравнению с хранением трех Integer и их сравнением.   -  person Brandon Barney    schedule 13.09.2017
comment
@mclapham Если проблема действительно в том, что код работает слишком быстро, просто добавьте Application.Wait(TimeValue("00:01:00")) перед вызовом PLTimer. Это добавит явное ожидание продолжительностью в минуту.   -  person Brandon Barney    schedule 13.09.2017
comment
stackoverflow.com/ вопросов/20002666/ Используйте отмену таймера в этом посте, установив общедоступную переменную для хранения времени последнего вызова.   -  person Nathan_Sav    schedule 13.09.2017
comment
Кажется, ни один из них не работает, когда я пробую метод application.wait, мой Excel зависает. Есть идеи?   -  person mclapham    schedule 13.09.2017
comment
Установите Application.Wait всего на одну секунду, например Application.Wait(TimeValue("00:00:01"))   -  person Kresimir L.    schedule 13.09.2017


Ответы (1)


@mclapham Я решил зависание, которое вы описали в своих комментариях, используя Application.Wait Now + TimeValue("00:00:01") перед повторным вызовом Application.OnTime.

person Tofulicious    schedule 06.03.2018