2016-10-28 3 views
0

В настоящее время у меня есть макрос, который обращается к каталогу и вытаскивает некоторые данные в мою таблицу. Первоначально у меня просто была кнопка для ввода информации и кнопка для удаления всего, но изменения были изменены, и теперь мне нужно ее автоматически запускать макрос, чтобы очистить существующие данные, а затем вытаскивать новые данные каждый час или около того.Excel 2007 VBA, чтобы приостановить макрос

Просматривая различные способы, по которым я могу потенциально приостанавливать макрос, оказывается, что цикл является лучшим способом для меня, потому что он позволит мне по-прежнему взаимодействовать с электронной таблицей во время ожидания.

Все, что сказал, вот что я сейчас имею, что, кажется, просто перебирает все, не останавливаясь ни на что.

В конце моего макроса я использую следующие

Call DelayOneHour 
Call RepActiveTicketsDelete 
Call DelayTwoSeconds 
Call RepActiveTicketsDataGrab 

А вот петли

Sub DelayOneHour() 

    Dim NowTick As Long 
    Dim EndTick As Long 

    NowTick = Now 
    EndTick = Now + TimeValue("0:01:00") 

    Do Until NowTick >= EndTick 
     DoEvents 
     NowTick = Now() 
    Loop 

End Sub 

Sub DelayTwoSeconds() 

    Dim NowTick As Long 
    Dim EndTick As Long 

    NowTick = Now 
    EndTick = Now + TimeValue("0:01:00") 

    Do Until NowTick >= EndTick 
     DoEvents 
     NowTick = Now() 
    Loop 

End Sub 

Спасибо за взгляд!

+0

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

+0

Итак, с кодом, который стоит, а не останавливается на минуту между запуском RepActiveTicketsDelete и RepActiveTicketsDataGrab, он просто запускает их назад и вперед примерно на 1-2-секундный интервал. Я не хотел использовать Application.OnTime, потому что это сделает приложение непригодным для использования, пока оно ждет (насколько я мог бы сказать в своем тестировании) – Josh

+0

Я понятия не имею, что вы имеете в виду под «огнем их вперед и назад около 1 -2-й интервал "... Я отправлю ответ, используя метод OnTime, посмотрим, поможет ли это. –

ответ

2

Я бы рассмотрел Application.OnTime как способ эффективно расписание Процедура запуска в более позднее время. Это освобождает среду выполнения (т. Е. Вы можете запускать другие макросы из других книг в течение 1 часа и т. Д.).

Вместо:

Call DelayOneHour 
Call RepActiveTicketsDelete 
Call DelayTwoSeconds 
Call RepActiveTicketsDataGrab 

ли это:

'Run the specified procedure in one hour: 
Application.OnTime Now + TimeValue("00:60:00"), "RepActiveTicketsDelete" 
Exit Sub 

Затем, в конце RepActiveTicketsDelete процедуры, вы запланировали RepActiveTicketsDataGrab процедуру:

'Run the specified procedure in two seconds: 
Application.OnTime Now + TimeValue("00:00:02"), "RepActiveTicketsDataGrab" 
Exit Sub 
+0

Это работает, чтобы пройти через правильный интервал, но, похоже, он влияет на некоторые из файлов форума, которые у меня запущены на листе. Кажется, они вычисляют только, когда приложение выполняется, чтобы запустить макрос. – Josh

+0

Проблема была на моей стороне, не уверен, что это было, но переход к более старой версии позаботился, если это произойдет. Благодаря! – Josh