Vba excel doevents примеры

Часть
1. Основы Visual Basiс

На главную самоучителя

12.10.2005

Глава
22.

Функция
DoEvents. Анализ ее влияния на быстродействие.
Организация прерывания цикла.
Цикл ожидания действий пользователя.

Скачать исходник примера "DoEvents"

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

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

Эта функция, согласно мануалу, возвращает значение типа Integer, представляющее
собой количество открытых форм, если фокус находится на форме Visual Basic и
ноль, если фокус находится на окнах других приложений. Ну это кому что интересно.
Главное это то, что эта функция передает управление операционной системе, то
бишь Windows, для обработки других событий. И после обработки Windows’ом всех
событий из очереди и передачи всех нажатий клавиш из очереди функции SendKeys
возвращает управление обратно в Visual Basic.

Хотя в использовании этой
функции нет особенных трудностей, учитывая специфику сайта, лучше один раз пощупать
функцию в маленькой процедурке, чем искать ошибку в большом проекте.
Создадим Exe-проектик, положим на форму кнопку Command1 и текстбокс Text1и напишем
маленькую процедурку:

Private Sub Command1_Click()
Dim x As Long
For x = 1 To 300000
Text1 = x
Next x
End Sub

Этот цикл по нашему разумению
должен выводить в Text1 постоянно меняющееся значение переменной X от 1 до 300000.
Запустим проект, нажмем кнопку Command1 и вместо созерцания мигающих циферек
в текстбоксе мы видим… ничего мы не видим — форма наша не обновляется до окончания
цикла. Да мы еще и не можем корректно приостановит выполнение цикла (я имею
в виду , если он откомпилирован). Более того, попробовав передвинуть мышью форму
мы убедимся, что это невозможно, а Менеджер задач (Task Manager) может выдать
сообщение, что программа зависла и не отвечает (not responding). Вот так, ходим
по минам, а подрываемся на говне.
Однако всего этого можно избежать, если ввести в цикл функцию DoEvents.
Тогда наша процедурка может выглядеть так:
Private Sub Command1_Click()
Dim x As Long
For x = 1 To 300000
Text1 = x
DoEvents
Next x
End Sub

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


в процедурах обработки событий Click. Но мне не удалось добиться никаких особенных
фатальных результатов, кроме перезапуска цикла, даже беспрестанно кликая по
кнопке Command1.

Основным недостатком этой функции является очень значительное уменьшение быстродействия
в длинных по времени циклах (в коротких ее вообще нет смысла использовать).
Самое простое решение этого вопроса — запуск DoEvents не при каждой итерации,
а например, при каждом сотом (или тысячном) проходе цикла, в зависимости от
его параметров. Решить это можно, например, вводя дополнительную переменную-счетчик
(в нашем примере y). С каждым проходом цикла счетчик увеличивается на
единицу, а при достижении им значения, например 1000, вызывает функцию DoEvents
и обнуляется, чтобы при дальнейшей работе цикла снова увеличится до 1000. Тогда
наша процедура будет выглядеть следующим образом:

Private
Sub
Command1_Click()
Dim x As Long
Dim y As Long
For x = 1 To 300000
Text1 = x
y = y + 1
If y = 1000 Then 'проверяем
счетчик итераций
'и если он совпадает с заданым числом, запускаем DoEvents и обнуляем счетчик

DoEvents
y = 0
End If

Next
x
End Sub

Если тебя уже раздражает
такое «ламерское» (но на мой взгляд удобное и наглядное решение),
можно отследить тысячный проход цикла по-другому, например деля значения счетчика
цикла x на эту тысячу с остатком (Mod) при каждой итерации, тогда при остатке
ноль можно считать, что значение х кратно нашей тысяче. Тогда наш код будет
выглядеть так:
Private Sub Command1_Click()
Dim x As Long
Dim y As Long
For x = 1 To 300000
Text1 = x
y = y + 1
If x Mod 1000 = 0
Then DoEvents

'получаем остаток от деления
'и если он равен нулю, запускаем DoEvents

Next
x
End Sub

А может быть снижение быстродействия не так уж и значительно и им можно пренебречь?
Чтобы нам не принимать все на веру, мы сами проведем соответствующее сравнительное
исследование зависимости быстродействия от частоты срабатывания функции DoEvents.
Для этого нам на форме дополнительно понадобятся Timer1, и еще два текстбокса
Text2 и Text3. В уже имеющийся Text1 мы будем вводить интервал цикла (по умолчанию
он у нас будет 300000), в Text2 — на какой итерации (1-ой, т.е. каждой, 100-ой,
10000-й и т.д ) будет включаться функция DoEvents. В Text3 выведем результат
измерений в миллисекундах.
Объявим три переменных:

Option
Explicit

Dim Iter As Long
'итерация срабатывания DoEvents
Dim RunTime As Integer
'время работы цикла
Dim RunLong As Long
'длина цикла

В процедуре Form_Load присвоим
начальные значения цикла и итераций:

Private Sub Form_Load()
Text2 = 1
Text1 = 1000000
End Sub

Код процедуры Command1_Click
Изменим следующим образом:

Private Sub Command1_Click()
Dim x As Long
Dim y As Long
Iter = Val(Text2) 'Присваиваем переменным значения для
цикла

RunLong = Val(Text1)
RunTime = 0
Text3 = "Цикл в работе"
Timer1.Interval = 1 'устанавливаем интервал таймера в
1 мск

Timer1.Enabled = True 'запускаем
таймер

For x = 1 To
RunLong
'обратите внимание на то, что вывод значений переменной
цикла X не выводится в Text1,
'так как это непомерные затраты времени и исказят наши значения.
'Text1 = x

y = y + 1
If y = Iter Then
DoEvents
y = 0
End If
Next
x
Timer1.Enabled = False 'выключаем
таймер

Text3 = RunTime 'выводим значение счетчика таймера в текстбокс
End Sub

'В процедуре таймера мы просто имеем счетчик,
который увеличивается
' на единицу при каждом включении, т. е. каждую миллисекунду.

Private Sub Timer1_Timer()
RunTime = RunTime + 1
End Sub

Скажу сразу, что данный эксперимент
не ставит собой целью получить точные данные, т. к. это невозможно хотя бы из-за
того, что процессор в Windows’е постоянно выполняет определенную работу в фоновом
режиме, и хотя мы этого не видим, но отнимает время у нашей программы. Для получения
корректных результатов промежуток времени работы цикла должен быть большой,
с тем, чтобы погрешность, скажем 5 мск была бы не критичной.
Попробуй запустить тест. При этом, конечно, не надо двигать форму по экрану,
чтобы не занимать дополнительного времени. Мы увидим, что при включении функции
DoEvents каждую 10-ю итерацию ускоряет цикл в 7-8 раз, каждую 100-ю —
в 18-20 раз. Т.е. функция DoEvents снижает быстродействие просто в разы!!!
Но тем не менее, использовать надо, но очень разумно.

Используя эту функцию мы можем позволить пользователю прервать продолжительный
процесс. Для этого достаточно ввести булеву переменную для флага, например Flag

,
которая и будет сигнализировать о том, что процесс необходимо прервать.
Добавим на форму кнопку Command2, которой и будем прерывать выполнение цикла.
В секцию (General) добавим объявление флага

Dim Flag As Boolean

В процедуре Command1_Click,
прямо в самом начале установим начальное для цикла значения флага:

Flag = False

а в самом цикле поставим
условие на выход

If Flag = True
Then Exit Sub

Теперь, для выхода из цикла
надо просто изменить значение флага False на True. Это мы и сделаем в процедуре
Command2_Click:

Private Sub Command2_Click()
Flag = True
Text3 = "Цикл прерван"
End Sub

Вот и готово. Теперь наша
кнопка Command2 прерывает цикл. Скачать исходник примера можно вверху страницы.

С помощью функции DoEvents можно также организовать цикл ожидания, прерываемый
пользователем. В качестве примера сделаем программку-шутку, которая иммитирует
предупреждение пользователю о начале форматирования жесткого диска. Для этого
в новом Exe-проекте на форме нам понадобится Label1, Command1 и Timer1.
Объявим пару переменных:

Option Explicit
Dim RunTime As Integer
'время в секундах
Dim Flag As Boolean 'флаг,
сигнализирующей о прерывании цикла

Для процедуры, собственно, цикла ожидания я выбрал событие
формы _Activate, так как оно возникает, когда форма уже загружена и инициализирована
и элементы на ней видимы.
Private Sub Form_Activate()
RunTime = 10 'устанавливаем начальные значения секунд
Timer1.Interval = 1000 'интервал срабатывания таймера
1 сек

Timer1.Enabled = True ' включаем
таймер

'организуем цикл, работающий до тех пор, пока переменная
RunTime
'не стане равной нулю (изменяется таймером)

Do Until RunTime = 0
DoEvents 'постоянно передаем управление Windows
If Flag Then 'проверяется,
нажата ли кнопка Command1 для
'прерывания цикла (Flag=True) или нет (Flag=False)

Label1 = "Молодец, успел, но все равно форматирование начинается!"

Exit Sub 'выход из процедуры,
если кнопка Command1 нажималась

End If 'конец условия
Loop 'конец цикла
Timer1.Enabled = False 'выключение
таймера

Label1 = "Не успел, не успел, надеюсь на винчестере ничего ценного нет?"
End Sub
В процедуре таймера
при каждом срабатывании (ежесекундно) уменьшаем значение RunTime на единицу
Private Sub Timer1_Timer()
RunTime = RunTime - 1
'и выводим соответствующее сообщение в лейбл
Label1 = "Форматирование диска начнется через " & RunTime &
" сек. " _
& " Успеешь нажать кнопку?"
End Sub

Процедура Command1_Click() управляет флагом и выключает таймер

Private Sub Command1_Click()
Timer1.Enabled = False
Flag = True
End Sub

Скачать исходник этого примера можно отсюда.


Copyright
©
2005 4us

Сайт создан в системе uCoz

  • Функция Excel VBA DoEvents

Функция Excel VBA DoEvents

Когда мы пишем огромные коды, мы всегда попадаем в ловушку VBA. Когда код большой, VBA тратит свое время на завершение запуска и выполнения процесса. Что может занять время от минуты до нескольких минут. Это период времени, когда все раздражаются. И мы не можем больше ничего делать в этот период времени. Но чтобы избежать этого, у нас в VBA есть функция DoEvents. С помощью DoEvents мы можем запускать код в фоновом режиме, и одновременно мы можем делать и другие вещи. Мы можем не только работать с другим инструментом или программным обеспечением, но также можем прерывать код или останавливаться между процессами исполнения.

Как только мы введем DoEvents в коде, кроме VBA, мы также получим контроль над работой, которую мы хотим сделать. Хорошая вещь о DoEvents — у него нет никакого синтаксиса для записи. Мы можем напрямую разместить Doevents там, где мы хотим взять под контроль VBA и выполнять задачи в соответствии с нашими потребностями.

Как использовать функцию DoEvents в Excel VBA?

Ниже приведены различные примеры использования функции DoEvents в Excel с использованием кода VBA.

Вы можете скачать этот шаблон VBA DoEvents Excel здесь — Шаблон VBA DoEvents Excel

Excel VBA DoEvents — Пример № 1

Хотя для выполнения DoEvents нам нужен огромный набор данных, где мы можем видеть, как код прерывается. Итак, мы будем использовать цикл, в котором числа будут применяться до тех пор, пока код не будет завершен. Для этого выполните следующие шаги:

Шаг 1: Откройте модуль в VBA из вкладки меню Вставка, как показано ниже.

Шаг 2: Напишите подпроцедуру VBA DoEvents, или мы можем выбрать любое имя, чтобы определить код в соответствии с нашими потребностями.

Код:

 Sub VBA_DoEvents () End Sub 

Шаг 3: Теперь определите переменную в любом имени с типами данных Long. Цель рассматривать тип данных как Long, потому что мы будем брать любую длину данных, которую мы хотим, что невозможно, если мы рассмотрим Integer.

Код:

 Sub VBA_DoEvents () Dim A As Long End Sub 

Шаг 4: Теперь откройте цикл For-Next, в который мы поместим условия.

Код:

 Sub VBA_DoEvents () Dim A As Long для следующего A End Sub 

Шаг 5: Рассмотрите диапазон числа по вашему выбору, который может быть замечен при реализации. Здесь мы берем диапазон от 1 до 2000 в определенной переменной A.

Код:

 Sub VBA_DoEvents () Dim A As Long для A = 1 до 20000 Next A End Sub 

Шаг 6: Как только мы определим диапазон чисел, мы выберем диапазон ячеек, где мы увидим изменения в числах, которые мы выбрали выше. Допустим, диапазон ячеек от А1 до А5. Это может быть и отдельная клетка.

Код:

 Sub VBA_DoEvents () Dim A As Long для диапазона A = от 1 до 20000 («A1: A5»). Значение = A Next A End Sub 

Шаг 7: Теперь запустите код, нажав кнопку Play, расположенную под строкой меню.

Мы увидим, что код завершился печатью чисел от 1 до 20000, но мы не смогли это остановить.

Шаг 8: Чтобы получить полный контроль над кодом, примените DoEvents после условий цикла, как показано ниже.

Код:

 Sub VBA_DoEvents () Dim A As Long для диапазона A = от 1 до 20000 («A1: A5»). Значение = A DoEvents Next A End Sub 

Шаг 9: Теперь снова запустите код. И в это время мы пытаемся остановить код, нажав кнопку «стоп», и мы заметим, что код будет остановлен между процессами до завершения пробной версии 20000.

Excel VBA DoEvents — Пример № 2

Существует другой тип процесса для реализации DoEvents. Но для этого нам также понадобится огромный код, как показано в примере-1. Для этого выполните следующие шаги:

Шаг 1: Напишите подпроцедуру VBA DoEvents, как показано ниже.

Код:

 Sub VBA_DoEvents2 () End Sub 

Шаг 2: Непосредственно открыть цикл For-next без определения переменной.

Код:

 Sub VBA_DoEvents2 () для следующего конца Sub 

Шаг 3: Выберите диапазон номеров, который будет работать. Пусть диапазон будет от 1 до 20000, как в примере-1.

Код:

 Sub VBA_DoEvents2 () для A = 1 до 20000 Next End Sub 

Шаг 4: Теперь непосредственно поместите любую работу для вывода, скажем, вывод такой, как показано ниже. И диапазон значений будет +1 от фактического значения.

Код:

 Sub VBA_DoEvents2 () Для A = 1 до 20000 Выход = Выход + 1 Следующий конец Sub 

Шаг 5: Теперь выберите диапазон, в котором мы хотим увидеть результат. Пусть клетка будет A1.

Код:

 Sub VBA_DoEvents2 () Для A = от 1 до 20000 Выход = Выход + 1 Диапазон («A1»). Значение = Выход Next End Sub 

Шаг 6: И наконец, мы поставим DoEvents в конце условия цикла For.

Код:

 Sub VBA_DoEvents2 () Для A = от 1 до 20000 Выход = Выход + 1 Диапазон («A1»). Значение = Выход DoEvents Next End Sub 

Шаг 7: Затем запустите код, нажав клавишу F5. Мы увидим, что мы можем делать что угодно, даже когда код работает. Для демонстрации я выбрал ячейки B1 и C1. Цифры достигли только 4348, что намного меньше установленного нами лимита.

Шаг 8: Если мы удалим DoEvents и запустим код, мы не сможем ничего сделать, пока код не завершит свой процесс. Давайте посмотрим это тоже.

Код:

 Sub VBA_DoEvents2 () Для A = от 1 до 20000 Выход = Выход + 1 Диапазон («A1»). Значение = Выход Next End Sub 

Шаг 9: Теперь запустите код снова. Как мы видим, пока мы пытались нажать «Стоп», код не останавливался. И функция воспроизведения все еще была включена.

Плюсы и минусы Excel VBA DoEvents

  • Мы можем работать с любым инструментом или файлом в фоновом режиме, пока код VBA будет работать параллельно.
  • Использование DoEvents не мешает нам делать ту работу, которую мы хотим, когда выполняется код.
  • Он перезаписывает рабочий лист или рабочую книгу, когда мы переключаемся между различными рабочими листами или рабочей книгой.
  • Код останавливается, когда мы пишем или меняем ячейку на мгновение, и мы не получаем уведомление.

То, что нужно запомнить

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

Рекомендуемые статьи

Это руководство по VBA DoEvents. Здесь мы обсуждаем, как использовать функцию DoEvents в Excel с использованием кода VBA, а также с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

  1. Как использовать StrConv в Excel VBA?
  2. Преобразование чисел в текст в Excel (примеры)
  3. Функция VBA ByRef (Примеры с шаблоном Excel)
  4. Excel SUMIFS с датами | Шаблон Excel

In this Article

  • VBA DoEvents Example
    • DoEvents Dangers
    • When to use DoEvents

This tutorial will discuss how to use the DoEvents command in VBA.

The VBA DoEvents function temporarily pauses a running macro, giving Excel a chance to process key presses, mouse clicks, and other operating system messages.

In long-running macros, Excel can appear to hang and become unresponsive, and the macro may be impossible to interrupt. If DoEvents is included in your code, users can be assured that the macro is still running, and can still interrupt execution if necessary.

VBA DoEvents Example

Consider the following code:

Public Sub Test()
    Dim i As Long

    For i = 1 To 20000
        Range(“A1”).Value = i
    Next i

End Sub

When you try this code, you’ll note that the Excel window can’t be interacted with. However, because it’s not very demanding on the processor, the macro can still be interrupted by pressing ESC or CTRL+BREAK.

If a lot of complex and demanding functions were being performed inside this loop, Excel would take longer to register a key press event – up to several minutes or possibly not at all, especially if the computer is running other programs at the same time.

Now add a single line with DoEvents below the Range assignment:

        Range("A1").Value = i
        DoEvents

If you run this code again, you’ll see that Excel is now responsive – it can be focused and brought to the foreground.  DoEvents is called every time through the loop, which ensures that the macro is always yielding execution so that Excel can process any messages sent to it.  Because this macro runs quickly, it almost seems as though it’s running in the background (though it isn’t) – more operations inside the loop would quickly expose that illusion.

DoEvents Dangers

Take a second look, though. More than simply allowing Excel to be focused, you can actually click around inside cells and even switch tabs while the macro is running (try it – you’ll see some funny behavior).  This shows one of the dangers of DoEvents – it can be the cause unintended consequences if your macro isn’t coded carefully.

Another danger is that DoEvents can serve as a window for other macros to run inside of.  Try this: place an ActiveX CommandButton on the worksheet, double-click it, and add the following code inside the CommandButton1_Click() event:

    Dim c As Range

    For Each c In Range("B3:E8")

        c.Value = c.Value + 1

    Next c

Toggle off Design Mode in Excel, then run the Test() macro you added earlier.  While the Test macro is running, you can click the CommandButton on the worksheet, and its associated macro will run as soon as DoEvents gives the Test() macro a break.

The danger here is if the CommandButton macro altered the data the Test() macro was working on, or triggered the Test() macro again.  You can end up with some extremely messy results if you’re not careful.

Finally, you should be aware that DoEvents will cause your macro to suffer a performance impact when called.  Inside a loop, this impact will add up quickly unless you limit how often DoEvents is called.  Referring to our Test() example, try this:

        If i Mod 1000 = 0 Then DoEvents

This visibly reduces Excel’s responsiveness, but the performance impact will be lessened.

When to use DoEvents

Despite these dangers, DoEvents is a handy function that aids in testing and debugging.  Consider adding DoEvents to long-running loops.

Another reason to include DoEvents is to allow for user feedback. For example, a macro might update a UserForm’s labels with progress indicators. Without DoEvents, Excel may not receive the messages to repaint the UserForm, giving a user the impression that the macro has stopped working – especially if you switch to another program and then try to switch back to Excel. With DoEvents however, the UserForm will continue to be repainted, and updates to the macro’s progress will continue to appear.

For the most part, DoEvents isn’t something you’ll want to include a lot in your code, and can often be omitted.  If responsiveness is something your macro needs though, don’t count it out!

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

Excel VBA DoEvents Function

With the help of VBA DoEvents, we can make the code run in the background and simultaneously allow us to work with excel and other application software. Furthermore, DoEvents allows us to work with other software and interrupt the running of the code.

The DoEvents function passes control to the operating system of the computer we are working on.

Table of contents
  • Excel VBA DoEvents Function
    • How to use DoEvents Function?
      • Interrupt the Code Running
    • Recommended Articles

VBA-DoEvents

You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA DoEvents (wallstreetmojo.com)

How to use DoEvents Function?

A large amount of VBA codeVBA code refers to a set of instructions written by the user in the Visual Basic Applications programming language on a Visual Basic Editor (VBE) to perform a specific task.read more is required when the requirement is huge. In those cases, Excel hangs and stops for some time, sometimes becoming unresponsive.

You can download this VBA DoEvents Excel Template here – VBA DoEvents Excel Template

For example, look at the below code.

Code:

Sub DoEvents_Example1()

    Dim i As Long

    For i = 1 To 100000

        Range("A1").Value = i

    Next i

End Sub

VBA DoEvents Example 1.1

The above code will insert serial numbers from 1 to 100000. Therefore, executing the task will take more than a minute. During the execution, excel hangs for a considerable time to complete the task. During this time, Excel shows the message “Excel Not RespondingWhen the Excel software hangs or freezes in the middle of a task, the «Excel no responding» message pops. There are multiple reasons which leads to such errors and there are multiple ways to troubleshoot his problem as well.read more.”

VBA DoEvents Example 1.3

Moreover, we cannot access the worksheet we are working on. It is a frustrating thing. So how do we make the Excel worksheet available to work while the code is running behind the screen?

We can achieve it by adding a VBA DoEvents function.

Code:

Sub DoEvents_Example1()

     Dim i As Long

     For i = 1 To 100000

          Range("A1").Value = i
          DoEvents

    Next i

End Sub

Example 1.2

When we add the function DoEvents in the code, we can access the Excel worksheet.

GIF

The above shows that the code is running, but we can access the worksheet.

Interrupt the Code Running

When the code runs behind the screen, we can add rows and columns, delete the same, rename the sheet, and do many other things. The moment we add DoEvents, it makes the VBA code run fast and allows us to feel that the mentioned task is running for itself.

  • One of the dangers of the DoEvents function is when we switch worksheets or workbooks, which overwrites the active sheet values.
  • Another danger is if we enter any value to the cell, the code execution halts, and it doesn’t even notify us.

Note: Despite the above dangers of DoEvents, it is still a handy function. We can use DoEvents as part of the debugging process when we try to fix bugs in the code we have written.

Recommended Articles

This article has been a guide to VBA DoEvents. Here, we learn how and when to use the DoEvents function in Excel VBA with the help of an example and a downloadable Excel sheet. You can learn more from the following articles: –

  • Double Data Type in VBA
  • Declare Array in VBA
  • VBA FreeFile
  • VBA Split

VBA DoEvents

Excel VBA DoEvents Function

When we write huge codes, we always fall into the trap of VBA. When the code is big, VBA takes its own time to finish the running and executing process. Which may take time from a minute to several minutes. This is the time frame when everyone gets irritated. And we cannot do anything else in this time period. But to avoid this, we have a function in VBA called DoEvents. By the help of DoEvents, we can run the code in the background and simultaneously we can do other kinds of stuff as well. We cannot only work on other tool or software but also we can interrupt the code or stop in between the process of execution.

Once we enter DoEvents in the code, then apart from VBA, we will also be having the control of work we want to do. The good thing about DoEvents is it doesn’t have any kind of syntax to write. We can directly place Doevents where we want to take control of VBA and perform the tasks as per our need.

How to Use DoEvents Function in Excel VBA?

Below are the different examples to use DoEvents function in excel using VBA code.

You can download this VBA DoEvents Excel Template here – VBA DoEvents Excel Template

Excel VBA DoEvents – Example #1

Although to execute DoEvents we need a huge set of data where we can see how the code is getting interrupted. So, we will use a loop, where the numbers will get applied until the code is completed. For this, follow the below steps:

Step 1: Open a module in VBA from Insert menu tab as shown below.

VBA DoEvents Example 1-1

Step 2: Write the subprocedure of VBA DoEvents or we can choose any name to define the code as per our need.

Code:

Sub VBA_DoEvents()

End Sub

VBA DoEvents Example 1-2

Step 3: Now define a variable in any name with data types Long. Purpose of considering the data type as Long is because we will be taking any length of data we want which is not possible if we consider Integer.

Code:

Sub VBA_DoEvents()

Dim A As Long

End Sub

VBA DoEvents Example 1-3

Step 4: Now open a For-Next loop where we will put the conditions.

Code:

Sub VBA_DoEvents()

Dim A As Long

For

Next A

End Sub

VBA DoEvents Example 1-4

Step 5: Consider the range of a number of your choice which can be seen getting implemented. Here we are taking the range 1 to 2000 in defined variable A.

Code:

Sub VBA_DoEvents()

Dim A As Long

For A = 1 To 20000

Next A

End Sub

VBA DoEvents Example 1-5

Step 6: Once we define the range of numbers, we will select the range of cells where we will see the changes in numbers which we chose above. Let’s say the range of cells is A1 to A5. This could be a single cell as well.

Code:

Sub VBA_DoEvents()

Dim A As Long

For A = 1 To 20000
  Range("A1:A5").Value = A
Next A

End Sub

VBA DoEvents Example 1-6

Step 7: Now run the code by clicking on the Play button located below the menu bar.

VBA DoEvents Example 1-7

We will see, the code has completed by printing the numbers from 1 to 20000 but we couldn’t stop it.

Step 8: To get full control of the code, apply DoEvents after the loop conditions as shown below.

Code:

Sub VBA_DoEvents()

Dim A As Long

For A = 1 To 20000
  Range("A1:A5").Value = A
  DoEvents
Next A

End Sub

VBA DoEvents Example 1-8

Step 9: Now again run the code. And at this time we try to stop the code by clicking the stop button, we will notice that code will get stopped between the processes before completing the trial of 20000.

VBA DoEvents Example 1-9

Excel VBA DoEvents – Example #2

There is another type of process for implementing DoEvents. But for this also we will need huge code as seen in example-1. For this, follow the below steps:

Step 1: Write the subprocedure of VBA DoEvents as shown below.

Code:

Sub VBA_DoEvents2()

End Sub

VBA DoEvents Example 2-1

Step 2: Directly open a For-next loop without defining a variable.

Code:

Sub VBA_DoEvents2()

For

Next

End Sub

VBA DoEvents Example 2-2

Step 3: Choose a number range we will see running. Let the range be 1 to 20000 same as example-1.

Code:

Sub VBA_DoEvents2()

For A = 1 To 20000

Next

End Sub

VBA DoEvents Example 2-3

Step 4: Now directly put any work for output, let’s say the output is as shown below. And the value range will be +1 of actual value.

Code:

Sub VBA_DoEvents2()

For A = 1 To 20000
Output = Output + 1

Next

End Sub

VBA DoEvents Example 2-4

Step 5: Now select the range where we want to see the output. Let the cell be A1.

Code:

Sub VBA_DoEvents2()

For A = 1 To 20000
Output = Output + 1
Range("A1").Value = Output
Next

End Sub

VBA DoEvents Example 2-5

Step 6: And at last we will put DoEvents at the end of For loop condition.

Code:

Sub VBA_DoEvents2()

For A = 1 To 20000
Output = Output + 1
Range("A1").Value = Output
DoEvents
Next

End Sub

VBA DoEvents Example 2-6

Step 7: And then run the code by pressing F5 key. We will see, we can do anything even when the code is running. For demonstration, I have selected the cells B1 and C1. The numbers reached at 4348 only which is quite less than the limit we set.

VBA DoEvents Example 2-7

Step 8: If we remove the DoEvents and run the code, we will be not able to do anything until the code gets completes its process. Let’s see that also.

Code:

Sub VBA_DoEvents2()

For A = 1 To 20000
Output = Output + 1
Range("A1").Value = Output
Next

End Sub

VBA DoEvents Example 2-8

Step 9: Now run the code again. As we can see, while we tried to click on Stop, the code didn’t stop. And the Play feature was still ON.

VBA DoEvents Example 2-9

Pros and Cons of Excel VBA DoEvents

  • We can work on any tool or file in the background while the VBA code will be running in parallel.
  • Using DoEvents doesn’t stop us doing the work we want when the code is running.
  • It overwrites the worksheet or workbook when we switch between the different worksheets or workbook.
  • The code stops when we write or change the cell for a moment and we don’t get notified.

Things to Remember

  • If we do anything without applying DoEvents, then there is a major possibility that the code makes the system and file freezed. And that we will either resume the files once the code is completely run or crash the file on multiple clicks.
  • We can see the change in the process while working on the other work simultaneously.
  • Once we complete the code, save the file in macro-enabled excel format to avoid losing code.
  • Try applying the code in a huge and big set of coding, there we will see the actual implementation and use.

Recommended Articles

This is a guide to VBA DoEvents. Here we discuss how to use DoEvents function in Excel using VBA code along with practical examples and downloadable excel template. You can also go through our other suggested articles –

  1. VBA StrConv
  2. VBA ByRef
  3. VBA RGB
  4. VBA XML

Like this post? Please share to your friends:
  • Vba excel doevents описание
  • Vba excel do while not eof
  • Vba excel do not save changes
  • Vba excel dir file
  • Vba excel dim что это