Трюк №86. Отображение сообщения «Please Wait»
Вы встречались с макросами, которые, казалось, никогда не закончатся? Если такая проблема возникает с вашим макросом, можно сделать так, чтобы во время работы макроса выводилось сообщение «Please Wait».
Большинство пользователей ожидает, что код будет выполняться и завершаться практически мгновенно. К сожалению, так бывает не всегда. Записанные макросы особенно часто выполняются намного дольше, чем правильно написанный код VBA. Хуже того, код VBA в Excel в целом выполняется медленнее, чем большинство других видов кода.
К счастью, можно написать еще немного кода и создать сообщение «Please Wait», чтобы пользователи знали, что код выполняется и Excel не завис во время работы макроса. К сожалению, один из наиболее популярных способов сообщить пользователям, что код выполняется, — использовать индикатор хода выполнения Excel.
В этом случае возникают две проблемы. Во-первых, индикатор хода выполнения может еще более замедлить ваш код, ухудшая ситуацию. Во-вторых, возможно, медленная работа кода вызвана циклом, а использовать утилиту записи макроса для создания цикла невозможно.
Мы предпочитаем код VBA, например, следующий макрос Dolt, который использует прямоугольник с панели инструментов Рисование (Drawing). Код его приведен в листинге 7.10.
1 2 3 4 5 6 7 8 9 10 | // Листинг 7.10 Sub DoIt() Application.ScreenUpdating = True With Sheetl.Shapes("Rectangle1") .Visible = msoTrue = (Not Sheet1.Shapes("Rectangle1") .Visible) End With //Переключение листов заставляет отображаться Rectangle1 во время выполнения кода Sheet2.Select Sheetl.Select End Sub |
Чтобы воспользоваться этим кодом, вставьте прямоугольник с панели инструментов Рисование (Drawing) на любой лист нужной рабочей книги. Не снимая выделения прямоугольника, щелкните поле Имя (Name) и введите имя прямоугольника — Rectangle1 (если ему еще не присвоено такое имя).
Введите текст, который должен отображаться во время выполнения кода, и отформатируйте, переместите и измените размер прямоугольника. Введите предыдущий макрос Dolt в стандартный модуль вашей рабочей книги. Если нужно, замените Sheet1 в коде на кодовое имя листа, на который вы поместили Rectangle1. Подробнее о кодовых именах — в разделе «Трюк № 83. Использование кодовых имен для ссылки на листы в рабочих книгах Excel».
Теперь выберите команду Разработчик → Макросы (Developer → Macros) и запустите макрос Dolt. Он полностью скроет Rectangle1. В самом начале медленно выполняющегося кода поместите код из листинга 7.11.
1 2 3 | // Листинг 7.11 Run "Dolt" Application.ScreenUpdating = False |
Благодаря строке Application.ScreenUpdating = False экран перестанет мерцать, и скорость выполнения макроса увеличится. В конце этого кода поместите строку Run «Dolt». Затем запустите макрос, как обычно.