VBA DoEvents

Содержание

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

В долго работающих макросах Excel может зависать и перестать отвечать, и выполнение макроса может быть невозможно прервать. Если DoEvents включен в ваш код, пользователи могут быть уверены, что макрос все еще выполняется, и при необходимости могут прервать выполнение.

Пример VBA DoEvents

Рассмотрим следующий код:

1234567891011 Публичный дополнительный тест ()Тусклый я до тех пор, покаДля i = от 1 до 20000Диапазон («A1»). Значение = i.Далее яКонец подписки

Когда вы попробуете этот код, вы заметите, что с окном Excel невозможно взаимодействовать. Однако, поскольку он не очень требователен к процессору, макрос все же можно прервать, нажав ESC или CTRL + BREAK.

Однако, если бы в этом цикле выполнялось много сложных и требовательных функций, Excel потребовалось бы больше времени для регистрации события нажатия клавиши - до нескольких минут или, возможно, вообще не было бы, особенно если на компьютере одновременно выполняются другие программы.

Теперь добавьте одну строку с DoEvents под назначением Range:

123 Диапазон ("A1"). Значение = iDoEvents

Если вы запустите этот код еще раз, вы увидите, что Excel теперь реагирует - его можно сфокусировать и вывести на передний план. DoEvents вызывается каждый раз в цикле, что гарантирует, что макрос всегда дает выполнение, чтобы Excel мог обрабатывать любые отправленные ему сообщения. Поскольку этот макрос выполняется быстро, кажется, что он работает в фоновом режиме (хотя это не так) - большее количество операций внутри цикла быстро обнажит эту иллюзию.

DoEvents Опасности

Однако взгляните еще раз. Больше, чем просто позволить Excel сфокусироваться, вы можете фактически щелкать внутри ячеек и даже переключать вкладки во время выполнения макроса (попробуйте - вы увидите забавное поведение). Это показывает одну из опасностей DoEvents - это может стать причиной непредвиденных последствий, если ваш макрос не будет тщательно закодирован.

Другая опасность заключается в том, что DoEvents может служить окном для запуска других макросов. Попробуйте следующее: поместите ActiveX CommandButton на лист, дважды щелкните его и добавьте следующий код внутри события CommandButton1_Click ():

1234567 Dim c As ДиапазонДля каждого c в диапазоне ("B3: E8")c.значение = c.значение + 1Следующий c

Выключите режим «Дизайн» в Excel, затем запустите макрос Test (), который вы добавили ранее. Пока выполняется макрос Test, вы можете щелкнуть CommandButton на листе, и связанный с ним макрос запустится, как только DoEvents даст макросу Test () паузу.

Опасность здесь заключается в том, что макрос CommandButton изменил данные, над которыми работал макрос Test (), или снова запустил макрос Test (). Если не проявить осторожность, вы можете получить очень неприятные результаты.

Наконец, вы должны знать, что DoEvents приведет к снижению производительности вашего макроса при вызове. Внутри цикла это влияние будет быстро накапливаться, если вы не ограничите частоту вызова DoEvents. Ссылаясь на наш пример Test (), попробуйте следующее:

1 Если я Mod 1000 = 0, то DoEvents

Это заметно снижает скорость отклика Excel, но снижает влияние на производительность.

Когда использовать DoEvents

Несмотря на эти опасности, DoEvents - удобная функция, которая помогает при тестировании и отладке. Рассмотрите возможность добавления DoEvents в длительные циклы.

Еще одна причина для включения DoEvents - это возможность обратной связи с пользователем. Например, макрос может обновлять метки UserForm индикаторами выполнения. Без DoEvents Excel может не получать сообщения для перерисовки UserForm, создавая у пользователя впечатление, что макрос перестал работать, особенно если вы переключитесь на другую программу, а затем попытаетесь снова переключиться на Excel. Однако с DoEvents пользовательская форма будет продолжать перерисовываться, а обновления выполнения макроса будут продолжать появляться.

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

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave