Офисные приложения однопоточные. Если вы выполняете чрезмерные действия в VBA, это может привести к тому, что приложение не будет реагировать на Windows, поэтому Windows создаст белое наложение поверх окна вашего приложения и добавит [Не отвечает] в заголовок окна.
DoEvents в основном говорит очереди сообщений Windows обрабатывать все сообщения, которые накопились с момента последней обработки сообщений. Если процесс простаивает, его сообщения обрабатываются немедленно, но если процесс очень занят, очередь сообщений может значительно увеличиться, и обработка откладывается до тех пор, пока процесс не вернется в состояние простоя. Иногда вы можете заметить, что все действия пользовательского интерфейса происходят мгновенно после достижения этого состояния, как в видео с замедленной съемкой. На самом деле не желательно.
Однако DoEvents следует использовать с осторожностью. Это редко решает любую проблему, просто добавляя строки кода DoEvents в произвольные места.
Подумайте и о бедных пользователях. Если у вас есть процесс, который занимает больше, чем несколько секунд, более чем приятно представить диалоговое окно прогресса с некоторой информацией о том, как далеко продвинулся процесс и сколько еще осталось сделать. Это убивает двух зайцев одним выстрелом. DoEvents служит хорошей цели здесь. Если вы назначаете новым заголовкам метки (например, процент выполнения) или устанавливаете свойство значения индикатора выполнения во время выполнения процесса, требующего больших нагрузок, изменения пользовательского интерфейса не будут отображаться на экране, пока не будет введена команда DoEvents (по крайней мере, когда ваш процесс еще идет). Таким образом, вы можете использовать DoEvents для регулярного обновления пользовательского интерфейса. Например, если вы обрабатываете записи из очень большой таблицы, обновляйте информацию о ходе выполнения каждые 100 записей или около того, а также убедитесь, что DoEvents будет выпущен в конце концов. Интервал зависит от того, сколько времени требуется для обработки ряда записей. Вы должны выбрать интервал, который может быть достигнут в течение секунды, чтобы информация о вашем прогрессе обновлялась достаточно часто. Если интервал слишком велик, приложение снова будет отображаться как не отвечающее.
Выбор правильного интервала обновления предотвратит зависание вашего пользовательского интерфейса и уменьшит разочарование пользователей, поскольку они получают представление о том, сколько времени им осталось ждать. Если вы убедитесь, что диалоговое окно прогресса является модальным, то у пользователей не будет возможности вмешаться, начав вводить текст в любую ячейку, пока процесс не завершится. Потому что это очень плохо. Начало редактирования ячейки изменяет функциональный контекст Excel. Многие функции заблокированы во время выполнения действия редактирования. Просто наблюдайте за лентой, когда вы переходите от навигации к ячейке к редактированию ячейки (с помощью F2 или чего-либо еще). Половина ленты станет серой. То же самое применяется за кулисами для многих методов Excel API. Это может привести к тому, что все виды ошибок времени выполнения будут игнорировать этот режим. Вы должны любой ценой запретить пользователям делать что-либо, кроме как ждать окончания вашего процесса. Но будьте добры и держите их в курсе; о)