Когда вы разрабатываете макрос для использования другими, вы можете добавить метод, позволяющий пользователю выйти из вашего макроса до его завершения, и при этом сохранить контроль над тем, что делает макрос. Ctrl + Break остановит макрос, но он не завершится корректно, поскольку позволяет пользователю просматривать код в редакторе VBA.
Есть несколько способов решения этой проблемы. Первый – встроить в макрос подсказку «хотите ли вы выйти», а затем заставить макрос периодически отображать это приглашение. Например, рассмотрим следующий код:
Do … ‘ваш код идет сюда Counter = Counter + 1 If Counter Mod 25 = 0 Then If MsgBox («Stop Macro?», VbYesNo) = vbYes Then End End IfLoop
Конструкция макроса основана на предположении, что у вас есть ряд шагов, которые вы хотите повторять снова и снова, с использованием структуры Do … Loop. Каждый раз при прохождении цикла значение Counter увеличивается. Каждые 25 раз в цикле “остановить макрос?” отображается приглашение, и у пользователя есть шанс выйти.
Этот подход легко реализовать, и для некоторых целей он может работать достаточно хорошо. Однако самым большим недостатком этого подхода является то, что он не допускает непосредственности – пользователь должен дождаться выхода из макроса до тех пор, пока не будет выполнено не менее 25 итераций.
Другой подход – «скрыть». код VBA и примените к нему пароль. Для этого выполните следующие действия в редакторе VBA:
- Выберите параметр «Свойства VBAProject» в меню «Инструменты». В редакторе отображается диалоговое окно “Свойства проекта”.
- Убедитесь, что отображается вкладка “Защита”. (См. Рис. 1.)
- Установите флажок «Заблокировать проект для просмотра».
- В поле «Пароль» введите пароль, который вы хотите использовать для защиты макроса.
- В поле Подтверждение пароля введите тот же пароль еще раз.
- Нажмите OK.
Рис. 1. Вкладка «Защита» в диалоговом окне «Свойства проекта».
Закройте редактор VBA, затем сохраните книгу. Когда проект VBA защищен, пользователь все еще может нажать Ctrl + Break , чтобы остановить макрос, но он не сможет добраться до реального кода программы. Они смогут выбирать только кнопки «Продолжить» или «Конец», обе из которых защищают ваш код. В качестве дополнительного преимущества этот подход также ограничивает просмотр вашего кода пользователем с помощью выбора меню, панели инструментов или ленты.
Однако, возможно, лучший подход – создать обработчик ошибок, который по сути брать на себя ответственность всякий раз, когда пользователь нажимает Esc или Ctrl + Break . Затем запущенный обработчик может спросить пользователя, действительно ли он хочет выйти, а затем корректно завершит работу, если он это сделает. Вот пример кода, который показывает, как это делается:
Приложение Sub Looptest (). EnableCancelKey = xlErrorHandler При ошибке GoTo ErrHandler Dim x Как долго Dim y Как долго Dim lПродолжать до тех пор, пока y = 100000000 Для x = 1 To y Шаг 1 Следующее приложение. EnableCancelKey = xlInterrupt Exit SubErrHandler: If Err.Number = 18 Then lContinue = подсказка: = Format (x/y, «0.0%») & _ «complete» & vbCrLf & _ «Продолжить (ДА)?» & vbCrLf & _ «Вы хотите ВЫЙТИ? [Нажмите НЕТ]» , _ Buttons: = vbYesNo) If lContinue = vbYes Then Resume Else Application.EnableCancelKey = xlInterrupt MsgBox («Программа завершена по вашему запросу») Exit Sub End If End If Application.EnableCancelKey = xlInterruptEnd Sub
Обратите внимание, что в этом примере используется метод EnableCancelKey, которому назначается имя метки, к которой следует перейти, если клавиша отмены ( Esc или Ctrl + Break ) нажата. В этом случае происходит переход к ErrHandler, и пользователя спрашивают, что делать. Если пользователь выбирает выход, макрос корректно завершается.
Обратите внимание, что первое, что делается после метки ErrHandler, – это проверка того, равно ли свойство Number объекта Err 18. Если это так, вы знаете, что была нажата клавиша отмены. Если нет, то произошла ошибка другого типа, и ее следует обрабатывать любым способом, подходящим для вашего макроса.
Источник: