Карта сайта

Rambler's Top100
Яндекс цитирования
Друзья сайта

Устранение зависания макроса функциями WaitMessage и DoEvents

Примеры на VBA Примеры API

Очень часто на  выполнении программного кода, в котором задействован большой объем данных и вычислений требуется немало времени. Например, у меня был случай, когда рекурсивный макрос потребовал 3 часов выполнения.  Как следствие, при таком раскладе, MS Office (Excel, Word и т.д.) и компьютер виснет. Нет возможности даже остановить выполнение макроса.

Выходом из этой ситуации может служить следующая процедура:

Public Sub Pause ()

Dim Start

Start = Timer

Do While Timer < Start + 0.0001

WaitMessage

DoEvents

Loop

End Sub

При запуске данной функции, переменной Start присваивается текущее время в миллисекундах.. Затем происходит цикл продолжительностью 0,0001 миллисекунд.

В процессе выполнения цикла происходит передача управления другим задачам и процессам на компьютере (операционной системе) с помощью функции DoEvents и API функции WaitMessage.  Тем самым исключая зависание макроса и давая возможность принудительно остановить выполнение кода.

Необходимо также объявить API функции WaitMessage:

 

Private Declare Function WaitMessage Lib «user32.dll» () As Long

 

Пример использования функции:

 

Sub Primer ()

………

For I = 1 to 100000000

……….

Call Pause

……….

Next i

……….

End Sub


28.09.2012, 752 просмотра.


Справочник VBA

Функии, опрераторы языка VBA - их описание и примеры использования при программировании в Microsoft Office (Excel, Word, Access, Outlook, PowerPoint и т.д.)

18.06.2012 08:40:24
Комментарии к ячейкам – добавление, удаление и получение их значения

22.05.2012 11:37:00
Объединение значений с помощью &