Отмена макроса и сохранение управления (Microsoft Excel)
Когда вы разрабатываете макрос для использования другими, вы можете добавить метод, позволяющий пользователю выйти из вашего макроса до его завершения, и при этом сохранить контроль над тем, что делает макрос. Ctrl + Break остановит макрос, но он не завершится корректно, поскольку позволяет пользователю просматривать код в редакторе VBA.
Есть несколько способов решить эту проблему. Первый — встроить в макрос запрос «вы хотите выйти?» И затем заставить макрос периодически отображать это приглашение. Например, рассмотрим следующий код:
Do ... ' your code goes here Counter = Counter + 1 If Counter Mod 25 = 0 Then If MsgBox("Stop Macro?", vbYesNo) = vbYes Then End End If Loop
Конструкция макроса основана на предположении, что у вас есть ряд шагов, которые вы хотите повторять снова и снова, с использованием структуры Do … Loop. Каждый раз при прохождении цикла значение Counter увеличивается. Каждые 25 раз в цикле «остановить макрос?» отображается запрос, и пользователь может выйти.
Этот подход легко реализовать, и он может хорошо работать для некоторых целей. Однако самым большим недостатком этого подхода является то, что он не допускает непосредственности — пользователь должен дождаться выхода из макроса, пока не будет выполнено не менее 25 итераций.
Другой подход — «спрятать» код VBA и применить к нему пароль.
Для этого выполните следующие действия в редакторе VBA:
-
Выберите параметр «Свойства VBAProject» в меню «Инструменты». Редактор отображает диалоговое окно «Свойства проекта».
-
Убедитесь, что отображается вкладка Защита. (См. Рис. 1.)
-
Установите флажок «Заблокировать проект для просмотра».
-
В поле Пароль введите пароль, который вы хотите использовать для защиты макроса.
-
В поле Подтверждение пароля введите тот же пароль еще раз.
-
Щелкните ОК.
Закройте редактор VBA, затем сохраните книгу. Когда проект VBA защищен, пользователь все еще может нажать Ctrl + Break, чтобы остановить макрос, но он не сможет добраться до реального кода программы. Они смогут выбирать только кнопки «Продолжить» или «Конец», обе из которых защищают ваш код. В качестве дополнительного преимущества этот подход также запрещает пользователю просматривать ваш код с помощью меню, панели инструментов или выбора ленты.
Однако, возможно, лучший подход — создать обработчик ошибок, который будет фактически брать на себя ответственность всякий раз, когда пользователь нажимает Esc или Ctrl + Break. Затем запущенный обработчик может спросить пользователя, действительно ли он хочет выйти, а затем корректно завершит работу, если он это сделает. Вот пример кода, который показывает, как это делается:
Sub Looptest() Application.EnableCancelKey = xlErrorHandler On Error GoTo ErrHandler Dim x As Long Dim y As Long Dim lContinue As Long y = 100000000 For x = 1 To y Step 1 Next Application.EnableCancelKey = xlInterrupt Exit Sub ErrHandler: If Err.Number = 18 Then lContinue = MsgBox(prompt:=Format(x / y, "0.0%") & _ " complete" & vbCrLf & _ "Do you want to Continue (YES)?" & vbCrLf & _ "Do you want to QUIT? [Click NO]", _ Buttons:=vbYesNo) If lContinue = vbYes Then Resume Else Application.EnableCancelKey = xlInterrupt MsgBox ("Program ended at your request") Exit Sub End If End If Application.EnableCancelKey = xlInterrupt End Sub
Обратите внимание, что в этом примере используется метод EnableCancelKey, которому назначается имя метки, на которую следует перейти при нажатии клавиши отмены (Esc или Ctrl + Break). В этом случае происходит переход к ErrHandler, и пользователя спрашивают, что делать. Если пользователь выбирает выход, макрос корректно завершается.
Обратите внимание, что первое, что делается после метки ErrHandler, — это проверять, равно ли свойство Number объекта Err 18. Если да, то вы знаете, что была нажата клавиша отмены. Если нет, то произошла ошибка другого типа, и ее нужно обрабатывать любым способом, подходящим для вашего макроса.
_Примечание: _
Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.
link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (3021) относится к Microsoft Excel 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Excel (Excel 2007 и новее) здесь:
link: / excelribbon-Aborting_a_Macro_and_Retaining_Control [Отмена макроса и сохранение управления]
.