Когда вы разрабатываете макрос для использования другими, вы можете добавить метод, позволяющий пользователю выйти из вашего макроса до его завершения, и при этом сохранить контроль над тем, что делает макрос. 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:

  1. Выберите параметр «Свойства VBAProject» в меню «Инструменты». Редактор отображает диалоговое окно «Свойства проекта».

  2. Убедитесь, что отображается вкладка Защита. (См. Рис. 1.)

  3. Установите флажок «Заблокировать проект для просмотра».

  4. В поле Пароль введите пароль, который вы хотите использовать для защиты макроса.

  5. В поле Подтверждение пароля введите тот же пароль еще раз.

  6. Щелкните ОК.

Закройте редактор 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 [Отмена макроса и сохранение управления].