Останов выполнения кода
Выполнение кода может остановиться по одной из следующих причин.
- Происходит неперехваченная ошибка во время выполнения.
- Происходит перехваченная ошибка во время выполнения и выбран элемент Останов при любой ошибке на вкладке Общие диалогового окна Параметры.
- Обнаружена точка останова.
- В коде обнаружен оператор Stop, выполняющий переключение в режим приостановки выполнения.
- В коде обнаружен оператор End, выполняющий переключение в режим разработки.
- Вы останавливаете выполнение вручную в данной точке.
- Обнаружено контрольное выражение, которое вызывает останов при выполнении определенных условий.
Остановка выполнения вручную
- Чтобы переключиться в режим приостановки, в меню Выполнить выберите Команду Break (CTRL+BREAK) или используйте сочетание клавиш на панели инструментов: .
- Чтобы переключиться на время разработки, в меню Выполнить выберите Сброс проекта или используйте ярлык на панели инструментов: .
Продолжение выполнения после остановки приложения
- В меню Отладка выберите команду Выполнить пошагово (F8), Шаг с обходом (SHIFT+F8), Шаг с выходом (CTRL+SHIFT+F8) или Выполнить до текущей позиции (CTRL+F8).
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Отправить и просмотреть отзыв по
Статья [VBA] Как задать сочетание горячих клавиш для запуска макроса?
При использовании макрорекордера для записи макроса в Excel, существует возможность сразу задать записываемому макросу сочетание горячих клавиш, которыми впоследствии этот макрос будет запускаться. Если же сочетание клавиш не было задано сразу, либо макрос не записывался макрорекордером, а был перенесен в модуль обычным копированием/вставкой, то назначить сочетание клавиши для такого макроса можно в любой момент.
Нажмите Alt+F8. В диалоговом окне «Макрос» нужно определить место нахождения макроса, выбрать имя макроса, для которого необходимо назначить сочетание клавиш и нажать кнопку «Параметры. «. После этого, в диалоговом окне «Параметры макроса» можно задать сочетание клавиш для запуска выбранного макроса.
Присвоенное таким способом сочетание хранится вместе с модулем и его не видно в коде.
Чтобы его просмотреть или перенести в другой документ вместе с сочитанием:
Спойлер: выполните следующее
Откройте редктор VBA (клавиши левый ALT + F11)
В левой части нажмите правой кнопкой по модулю, Export.
В новой книге сделайте аналогично, но с клавишей Import.
Внутри файла сочетание будет выглядеть так:
2) Временно, через код макроса
Возможно, вы хотите включить сочетание клавиш на время выполнения каких-то операций, и
выключить егопри дальнейшей работе. Следующая строка кода временно присваивает процедуре MoveDown вызов сочетанием клавиш Ctrl + m:
VB.NET / VBA:
Application.OnKey Key:="^m", Procedure:="MoveDown"
Чтобы отменить комбинацию, используйте строку:
VB.NET / VBA:
Application.OnKey Key:="^m"
3) Постоянно, через код макроса:
Чтобы окончательно изменить клавишу быстрого доступа с помощью кода, используйте строку:
VB.NET / VBA:
Application.MacroOptions Macro:="MoveDown", ShortcutKey:="^m"
Все доступные спецсимволы и спец. клавишы вроде Ctrl, Shift . для сочетаний вы можете посмотреть здесь: Application.OnKey Method (Excel)
Для MS Word
1) Во время записи макроса
Для Word 2003. Меню «Сервис«, Макрос, Начать запись.
Выберите, где хранить макрос — текущем документе или в Normal.dot (тогда макрос будет доступен из-под любого документа)
Нажмите пиктограмму Клаиватуры.
Поставьте курсор в поле «Новое сочетание клавиш» и нажмите на клавиатуре желаемое сочетание.
Выберите расположение, где хотите сохранить сочетание — в текущем документе, или доступное из-под всех документов.
Выполните действия в документе, которые хотите записать. В конце, завершите запись кнопкой «Стоп»:
Для Word 2008 и новее, см. здесь: Настройка сочетаний клавиш — Word
2) Программно из-под кода макроса (временное, для текущего документа)
В некоторых случаях бывает необходимо в пакетном режиме назначить в Word тем или иным командам и макросам «горячие клавиши».
Макрокоманда, назначающая «горячие клавиши», имеет следующий принципиальный вид:
VB.NET / VBA:
CustomizationContext = NormalTemplate KeyBindings.Add KeyCode:=BuildKeyCode(), _ KeyCategory:=wdKeyCategoryCommand, Command:=""
wdKey, [wdKeyControl,] [wdKeyShift,] [wdKeyAlt]
где:
— wdKey – нажатие клавиши, соответствующей указанной букве или цифре,
— wdKeyControl – нажатие клавиши Ctrl,
— wdKeyShift – нажатие клавиши Shift,
— wdKeyAlt – нажатие клавиши Alt.
Например:
wdKeyS, wdKeyControl – сочетание клавиш Ctrl+S
wdKeyQ, wdKeyControl, wdKeyAlt – сочетание клавиш Ctrl+Alt+Q
wdKeyP, wdKeyControl, wdKeyShift, wdKeyAlt – сочетание клавиш Ctrl+Shift+Alt+P
Элемент можно взять из окна Настройка клавиатуры (для Word 2013: Файл – Параметры – Настроить ленту – Настройка…). Например:
FileSave – команда сохранения файла
InsertPicture – вставка рисунка из графического файла и т.д.
Для описания наименования макроса используется следующая конструкция:
Указанные параметры можно найти в окне редактора VBA.
Например:
Normal.NewMacros.CompletePreparationSelection – шаблон Normal.dotm или Normal.dot, модуль (обычно в разделе Modules) NewMacros, макрос CompletePreparationSelection.
Пример модуля, назначающего «горячие клавиши»:
VB.NET / VBA:
Sub HotKeys() ' CustomizationContext = NormalTemplate KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyQ, wdKeyControl, wdKeyAlt), _ KeyCategory:=wdKeyCategoryCommand, Command:="DocEncryption" ' Команде DocEncryption назначается сочетание клавиш Ctrl+Alt+Q CustomizationContext = NormalTemplate KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyS, wdKeyControl), KeyCategory:= _ wdKeyCategoryCommand, Command:="FileSave" ' Команде FileSave назначается сочетание клавиш Ctrl+S CustomizationContext = NormalTemplate KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyP, wdKeyControl, wdKeyShift, _ wdKeyAlt), KeyCategory:=wdKeyCategoryCommand, Command:="Normal.NewMacros.CompletePreparationSelection" ' Макросу Normal.NewMacros.CompletePreparationSelection назначается сочетание клавиш Ctrl+Shift+Alt+P: End Sub
Чтобы иметь возможность удалить назначенное сочетание клавиш необходимо использовать чуть другой синтаксис при назначении комбинации (с ключевым словом set):
Пример назначения и отмены:
VB.NET / VBA:
Private oKey1 as KeyBinding Public Sub BindKey() 'Назначение клавиш Alt + Crl + Num4 (цифра 4 на цифровой клавиатуре) With Application .CustomizationContext = ThisDocument Set oKey1 = .KeyBindings.Add( _ KeyCode:=BuildKeyCode(wdKeyAlt, wdKeyControl, wdKeyNumeric4), _ KeyCategory:=wdKeyCategoryCommand, _ Command:="GotoNoteBack") end with end sub 'очистка сочетания Private Sub UnBind() oKey1.Clear End Sub
ВАЖНОЕ ЗАМЕЧАНИЕ:
У этого способа есть неприятный момент, при переходе к другому документу, комбинация сбрасывается. Как это обойти читайте в пункте 3:
3) Программно из-под кода макроса (постоянное, для текущего документа)
Это просто хак, который выполняет роль постоянного назначения на базе предыдущего примера.
Мы просто будем вызывать KeyBindings через событие автозапуска документа.
А чтобы сочетание не сбрасывалось мы его будем каждый раз восстанавливать с помощью события WindowActivate.
Нижеуказанный код поместите в модуль ThisDocument . и перезапустите Word:
VB.NET / VBA:
Option Explicit Private WithEvents appWord As Word.Application Dim oKey1 As KeyBinding Private Sub appWord_WindowActivate(ByVal Doc As Word.Document, ByVal Wn As Word.Window) Call BindKey End Sub Private Sub Document_Close() On Error Resume Next oKey1.Clear End Sub Private Sub Document_Open() Set appWord = Word.Application Call BindKey End Sub Private Sub BindKey() With Application .CustomizationContext = ThisDocument Set oKey1 = .KeyBindings.Add( _ KeyCode:=BuildKeyCode(wdKeyAlt, wdKeyControl, wdKeyNumeric4), _ KeyCategory:=wdKeyCategoryCommand, _ Command:="Macro1") End With End Sub Public Sub Macro1() msgbox "Вызвана процедура Macro1" End Sub
Примечание: Макрос, вызываемый через KeyBindings, должен иметь область видимости Public.
Доступные для назначения клавиши можно посмотреть по ссылке: WdKey Enumeration (Word)
Другие способы и замечания:
Стандартно, сочетания можно назначать не на все клавиши. А часть сочетаний уже задействована под служебные функции.
Однако, есть способ это обойти, хотя и небезопасный.
Я протестировал API-функцию RegisterHotkey, которая с этим замечательно справляется.
Один большой минус, чтобы «Словить» сочетание требуется создание сабклассинга оконной процедуры. А это непростая тема для VBA, так как я ещё не видел надёжного кода сабклассинга под MS Office, который бы не обрушил программу (крэш) при выполнении некоторых операций.
По понятным причинам код не выкладываю. Однако, вы можете попросить мой вариант в ЛС.
Последнее редактирование: 7 Ноя 2016
auto-teacher
Новый пользователь
Сообщения 25 Реакции 4
Стандартно, сочетания можно назначать не на все клавиши. А часть сочетаний уже задействована под служебные функции.
Однако, есть способ это обойти, хотя и небезопасный.
Я протестировал API-функцию RegisterHotkey, которая с этим замечательно справляется.
Этим своим сообщением Вы вселяете в меня надежду на решение многолетней проблемы, которая появилась в Word’ах с ленточным интерфейсом!
Указанные ниже восемь комбинаций не поддаются штатными способами для назначения на них макрокоманд в Word 2013:
Alt+Num /. Alt+Shift+Num /
Alt+Num *. Alt+Shift+Num *
Alt+Num -. Alt+Shift+Num —
Alt+Num +. Alt+Shift+Num +
Можете ли Вы, уважаемый Dragokas, выяснить, что именно этому препятствует?
Не поможет ли упоминаемая Вами API-функция RegisterHotkey справиться с этими тугими сочетаниями?
Последнее редактирование: 16 Ноя 2016
Dragokas
Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения 7,535 Реакции 6,392
auto-teacher, можно. И я проверял, это работает.
Этому препятствует необходимость зайдействовать код так называемого сабклассинга оконных сообщений, который используется чтобы поймать нажатие зарегистрированного сочетания клавиш.
Этот код небезопасен, точнее еще не нашлось автора который смог бы под MS Office его написать безопасным. В итоге, при попытке, например, остановить выполнение макроса весь процесс Winword.exe и открытые в нём документы рухнут (крэш). Это только один из вариантов; может рухнуть, например, если попытаться что-то сделать в режиме конструктора (детально не проверял).
Именно поэтому я не выкладываю в открытый доступ этот код.
Тем не менее, Вы можете попросить в ЛС мою модификацию этого кода. Собственно, он выложен на vbforums.com: [vba] Ways for improvement of MS Office window subclassing-VBForums
Уверен, что для банальной задачи, вроде открыть только один документ, выполнить простейшие операции по редактированию текста, затем закрыть документ (тем самым прекратив сабклассинг), это будет вполне безопасно. Но для редактирования кода макроса желательно открывать такой документ с отключёнными макросами.
Последнее редактирование: 17 Ноя 2016
auto-teacher
Новый пользователь
Сообщения 25 Реакции 4
Уважаемый Dragokas!
Как-то странно получается.
На нескольких крутых форумах я пытаюсь найти решение, которое позволило бы мне применить указанные сочетания для внутренних макрокоманд Word, и никто даже близко не подошел к сути проблемы. Где же они — знатоки Windows?
Даже если кто-то и пытается что-то посоветовать — (включая и эту тему API-функций, и вмешательство через административные шаблоны Офиса, и редактирование реестра Windows) — никто не может дознаться: а какая собственно прога в системе этими комбинациями распоряжается. Раньше-то эти сочетания были доступными!
Как все-таки узнать, где: в системе или в программе Word — лежит эта инфа? Какой ресурс держит для себя эти сочетания?
Почему, например, любое из указанных сочетаний срабатывает для запуска Проводника, Блокнота, браузера, но не принимает внутренние команды Word?
Что касается Вашего кода, то мне не ясно, что значит: «поймать нажатие зарегистрированного сочетания клавиш»? Как это? Вроде как оно в какой-то службе зарегистрировано, а мы его раньше нее поймаем, а потом себе возьмем? Так что ли?
Не проще ли определить, где зарегистрированы эти сочетания по умолчанию? И отменить их.
В связи с этим я должен напомнить еще одну проблему, которая мне попалась в Windows 8 и Word 2013. Она мне крови попортила, пока чудом не пришло решение. Суть такая: есть две кнопки Alt — левая и правая, но отдельно работает только одна левая.
Чтобы увидеть это, надо Вам проверить все на своем компе (Вы же недавно Word 2013 поставили?).
1. Назначьте для макроса TableInsertTable такое сочетание: Alt+t.
2. А для макроса PageSetupMargins назначьте: Ctrl+Alt+t.
Теперь:
если Вы нажмете Left_Alt+t — произойдет вставка таблицы.
если нажмете Left_Ctrl+Left_Alt+t — откроются параметры страницы.
а если нажмете Right_Alt+t, то смею предположить, что в Вашем Word’е правый Alt сработает как Ctrl+Alt, и вместо вставки таблицы, откроются параметры страницы. Так это или нет?
Остановить выполнение макроса VBA
Возможно ли как-то остановить выполнение макроса без завершения процесса, если он, допустим, зашел в бесконечный цикл и вызвал зависание всего Excel?
Отслеживать
16.6k 8 8 золотых знаков 26 26 серебряных знаков 56 56 бронзовых знаков
задан 12 сен 2017 в 20:02
717 11 11 серебряных знаков 31 31 бронзовый знак
Без кода как-то не очень ясна ситуация и условия в которых возникает бесконечный цикл или вы говорите о любых вариантах когда нужна «серебряная пуля»?
13 сен 2017 в 3:16
Можно в цикле использовать DoEvents, тогда думаю его можно остановить без особых усилий. Если конечно речь об этом.
13 сен 2017 в 3:19
Для принудительной ручной остановки VBA-кода используется сочетание клавиш Ctrl-Break. Однако если в коде нет DoEvents, можно весьма долго ждать, пока это сочетание пробьётся к дебаггеру.
13 сен 2017 в 4:38
При написании/отладке DoEvents. Но в рабочем коде не должно быть возможности зацикливания. Наgример, проверка значения переменной: If bf=True Then Exit For
13 сен 2017 в 11:29
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Один из вариантов контроля бесконечного цикла это контроль по времени. Т.е. задаем максимально допустимый интервал времени по истечение которого происходит выход из цикла. Например.
TimeInterval = 25 'секунд t1 = Timer ' задаем начальное время Do ' бесконечный цикл tElepsed = Timer - t1 If tElapsed > TimeInterval Then Exit Do End if 'тело цикла ' Loop
Как остановить макрос vba excel сочетание клавиш
Здравствуйте!
У меня есть файл excel, при открытии которого, каждую минуту происходят определенные действия в файле путем запуска макросов. Фрагмент программного кода приведен ниже.
Private Sub Workbook_Open()
.
.
Application.OnTime TimeValue(«08:00:00»), «Макрос_1»
Application.OnTime TimeValue(«08:01:00»), «Макрос_2»
Application.OnTime TimeValue(«08:02:00»), «Макрос_3»
Application.OnTime TimeValue(«08:03:00»), «Макрос_4»
.
.
End Sub
Помогите, пожалуйста, решить задачку с остановкой и запуском макроса «Workbook_Open» с кнопок «пуск» и «стоп», которые будут расположены на рабочем листе.
Сообщений: 60949 Регистрация: 14.09.2012
Контакты см. в профиле
18.01.2009 12:41:19
Как-то странно: Вы хотите разместить эти кнопки на листе той книги, которую планируете открывать. А как же добраться до этих кнопок, когда книга ещё не открыта? И зачем нажимать на кнопку «Пуск», которая открывает книгу (ведь она УЖЕ открыта), и как Вы представляете себе «Стоп» открытия книги?
18.01.2009 12:45:11
Может бы вам попробовать сочетанием клавиш её запускать и отключать?
18.01.2009 12:54:28
Может я как-то непонятно объяснил. Попробую объяснить, хотя я и не силен в VBA. У меня при открытии файла excel запускается макрос «Workbook_Open», который каждую минуту запускает макросы «Макрос_1», «Макрос_2» и т.д. Для макроса «Workbook_Open» мне необходимо сделать кнопки пуска и остановки, которые необходимо будет расположить на рабочем листе. Если это конечно можно сделать?
18.01.2009 13:00:23
всавьте элемент управления Commandbutton1 и Commandbutton2 и к ним пишите
18.01.2009 13:03:39
Вставить то я вставлю, а что написать?
Сообщений: 60949 Регистрация: 14.09.2012
Контакты см. в профиле
18.01.2009 13:06:26
Я понял, что Вы хотите. Я не понимаю как можно остановить октрытие уже открытой книги? И зачем кнопкой «Пуск» открывать УЖЕ открытую книгу? Вот это мне не ясно. Может кнопка «Пуск» должна открывать ДРУГУЮ книгу?
Попробуйте описать примерно так: «Я открываю книгу, начинают работать некие макросы. Я хочу кнопкой «Пуск» сделать . , а кнопкой «Стоп» сделать . »
Ведь работу самого макроса Workbook_Open не остановить. Он УЖЕ сработал — вызвал на исполнение другие макросы.
18.01.2009 13:10:58
а можно ли дописать в этот макрос . если кнопка пуск не выполнена то переход макросов по времени .
Application.OnTime TimeValue(«08:00:00»), «Макрос_1»
Application.OnTime TimeValue(«08:01:00»), «Макрос_2»
Application.OnTime TimeValue(«08:02:00»), «Макрос_3»
Application.OnTime TimeValue(«08:03:00»), «Макрос_4»
18.01.2009 13:17:57
Попробуйте описать примерно так: «Я открываю книгу, начинают работать некие макросы. Я хочу кнопкой «Пуск» сделать . , а кнопкой «Стоп» сделать . »
Ведь работу самого макроса Workbook_Open не остановить. Он УЖЕ сработал — вызвал на исполнение другие макросы.
Понятно, а макрос Workbook_Activate остановить можно?
Сообщений: 60949 Регистрация: 14.09.2012
Контакты см. в профиле
18.01.2009 13:22:32
Не представляю, как это сделать. Может быть Вы хотите кнопкой «Стоп», после того как началось выполнение макросов, перечисленных в Workbook_Open, в нужный Вам момент времени приостановить выполнение этого списка? А по кнопке «Пуск» продолжить?
18.01.2009 13:26:56
Да именно это я и хочу сделать, но не знаю как.
18.01.2009 13:32:01
Workbook_Activate
если пуск нажат то выполняется макрос1,2 и.т.д.,
если нет, то он запустится сам
может так стоит написать?
Сообщений: 60949 Регистрация: 14.09.2012
Контакты см. в профиле
18.01.2009 13:32:03
Ну что же Вы. Посмотрите сколько времени потрачено, чтобы понять ЧТО Вы хотите. Старайтесь правильно формулировать вопросы. Попробую сейчас. А может, пока я думаю,- кто-нибудь ещё подключится.
А Вы пока почитайте тему чуть ниже. «Курсор» называется. Это я к вопросу формулировок.
18.01.2009 13:55:21
Private Sub Workbook_Activate()
If CommandButton1_Click Then
Application.OnTime TimeValue(«08:00:00»), «Макрос_1»
Application.OnTime TimeValue(«08:01:00»), «Макрос_2»
Application.OnTime TimeValue(«08:02:00»), «Макрос_3»
Application.OnTime TimeValue(«08:03:00»), «Макрос_4»
Else:
Application.OnTime TimeValue(«08:00:00»), «Макрос_1»
Application.OnTime TimeValue(«08:01:00»), «Макрос_2»
Application.OnTime TimeValue(«08:02:00»), «Макрос_3»
Application.OnTime TimeValue(«08:03:00»), «Макрос_4»
End If
End Sub
18.01.2009 13:57:11
может после каж.макроса выводить запрос на некот. время, который
если не подтверждается запускает следующии макрос
Сообщений: 60949 Регистрация: 14.09.2012
Контакты см. в профиле
18.01.2009 14:07:09
Вот что Вам нужно. На дружественном сайте:
http://msoffice.nm.ru/faq/macros/miscellaneous.htm#faq71
«Как прервать/приостановить выполнение макроса»
Вариант I. Нажмите клавишу ESC.
Вариант II. Или нажмите комбинацию клавиш CTRL + BREAK.
Затем нажмите кнопку Завершить / End
Application.EnableCancelKey = xlDisabled
‘Здесь должен быть код Вашей программы.
Application.EnableCancelKey = xlInterrupt
— — —
On Error GoTo CancelHandler
Application.EnableCancelKey = xlErrorHandler
‘Здесь должен быть код Вашей программы.
CancelHandler:
Application.EnableCancelKey = xlInterrupt
If Err.Number = 18 Then _
MsgBox «Вы нажали кнопку ESC или CTRL + BREAK»
Но существуют и другие возможности. На Форуме уже было.
Пользователь
Сообщений: 2410 Регистрация: 01.01.1970
19.01.2009 09:02:58
Увлекательная игра «ЧХИ» (Чего хочет Ирэна) продолжается 🙂
Chae, Вы не хотите, чтобы запуск макросов назначался при открытии книги? Хотите запускать вручную? Тогда в код кнопки Пуск:
Private Sub CommandButton1_Click()
Application.OnTime TimeValue(«08:00:00»), «Макрос_1»
Application.OnTime TimeValue(«08:01:00»), «Макрос_2»
Application.OnTime TimeValue(«08:02:00»), «Макрос_3»
Application.OnTime TimeValue(«08:03:00»), «Макрос_4»
End Sub
Если кнопка Стоп в Вашем понимании это отмена запуска в назначенное время, то код такой:
Private Sub CommandButton2_Click()
Application.OnTime TimeValue(«08:00:00»), «Макрос_1», , False
Application.OnTime TimeValue(«08:01:00»), «Макрос_2», , False
Application.OnTime TimeValue(«08:02:00»), «Макрос_3», , False
Application.OnTime TimeValue(«08:03:00»), «Макрос_4», , False
End Sub
А Private Sub Workbook_Open() удалите/закомментируйте.
