Остановка макроса executution Excel при нажатии клавиши Esc не получится

Я запускаю excel 2007 на XP.

есть ли способ остановить запуск макроса во время его выполнения, кроме нажатия escape? Обычно, если я думаю, что создал цикл infinate или иным образом испортил что-то, я нажимаю escape, и он выдает ошибку, но макрос останавливается.

на этот раз (и я делал это раньше, но не так плохо), я настроил msgbox для быстрой отладки. Оказывается, он должен был сделать цикл около 6000 раз, что означало, что я должен был "ОК" 6000 сообщение коробки, которые заняли несколько минут. Я не сохранил перед запуском (еще одна ошибка), поэтому я не мог открыть Диспетчер задач для выхода.

есть ли другой способ остановить выполнение макроса, если я снова облажаюсь?

10 ответов


использовать клавиш crtl+перерыв приостановить выполнение в любой момент. Вы будете помещены в режим перерыва и можете нажать Ф5 продолжить исполнение или ф8 для выполнения кода шаг за шагом в визуальном отладчике.

конечно, это работает только тогда, когда нет открытого окна сообщения, поэтому, если ваш код VBA постоянно открывает окна сообщений по какой-то причине, будет немного сложно нажать клавиши справа момент.

вы даже можете редактировать большую часть кода во время его работы.

использовать Debug.Print для распечатки сообщений в Окно в Редакторе VBA это более удобно, чем MsgBox.

использовать точки останова или Stop ключевое слово для автоматической остановки выполнения в интересных областях.

можно использовать Debug.Assert to остановить выполнение условно.


CTRL + SCR LK (блокировка прокрутки) работал для меня.


иногда, правильный набор ключей (пауза, перерыв или ScrLk) недоступны на клавиатуре (в основном это происходит с пользователями ноутбуков) и нажатие Esc 2, 3 или несколько раз не остановить макрос.

Я тоже застрял и в конце концов нашел решение в функции доступности Windows, после чего я попробовал все исследованные варианты, и 3 из них работали для меня в 3 разных вариант развития событий.

шаг #01: если ваша клавиатура не имеет определенной клавиши, пожалуйста, не волнуйтесь и откройте "экранную клавиатуру" из утилит Windows, нажав Win + U.

шаг #02: теперь попробуйте любой из приведенных ниже вариантов, и из них, безусловно, будет работать в зависимости от вашей архитектуры системы, т. е. OS и Office version

  • Ctrl + пауза
  • Ctrl + ScrLk
  • Esc + Esc (нажать два раза подряд)

вы будете переведены в режим перерыва, используя вышеуказанные комбинации клавиш, так как макрос приостанавливает выполнение сразу после завершения текущей задачи. Для EG. если он вытягивает данные из интернета, то он остановится непосредственно перед выполнением любой следующей команды, но после вытягивания данных, после чего можно нажмите Ф5 или ф8 для продолжения отладки.


вы можете остановить макрос, нажав ctrl + перерыв но если у вас нет ключа разрыва вы можете использовать этот autohotkey (открытым исходным кодом) код:

+ ESC:: SendInput {CtrlBreak} возвращение

клавишей shift + побег будет похоже на нажатие ctrl + перерыв и таким образом остановить ваш макрос.

вся слава на этой странице


мне также нравится использовать MsgBox для отладки, и я столкнулся с этой же проблемой несколько раз. Теперь я всегда добавляю кнопку отмены во всплывающее окно и выхожу из макроса, если нажата отмена. Пример кода:

    If MsgBox("Debug message", vbOKCancel, "Debugging") = vbCancel Then Exit Sub

вы также можете попробовать нажать" FN "или функциональную клавишу с помощью кнопки" Break "или с помощью кнопки" sys rq " - системный запрос, как это - должны быть нажаты вместе, и это останавливает любой запущенный макрос


Я обнаружил, что иногда, когда я открываю второе окно Excel и запускаю макрос в этом втором окне, выполнение первого останавливается. Я не знаю, почему он не работает все время, но вы можете попробовать.


Я забыл прокомментировать строку с помощью MsgBox перед выполнением моего макроса. Это означает, что мне придется нажать " ОК " более ста тысяч раз. Клавиша ESC просто выходила из окна сообщения, но не останавливала выполнение макроса. Удержание клавиши ESC непрерывно в течение нескольких секунд помогло мне остановить выполнение кода.


мое небольшое ретроспективное предложение-вставить остановку после каждого Msgbox, который вы используете в отладке. Если вы пишете для Msgbox, который возвращает ответ (например, VbOk, VbCancel), также добавьте оператор Stop к каждому. Вытащите стоп-заявления, когда все будет идеально.


это никоим образом не элегантное решение, и я бы не рекомендовал, если вы не в отчаянии.

Если вы перебираете данные, вы можете проверить наличие файла в папке где-то в вашем цикле i.e код продолжает выполняться до тех пор, пока в папке не найден определенный файл. Вы можете сделать это, добавив строки:

DirFile = FilePath & "ExampleFolder\stop.txt"
If Len(Dir(DirFile)) = 0 Then
Else
    MsgBox ("Code stopped by stopfile")
    Exit Sub
End If

в конце цикла. Это выйдет из sub, если вы добавите текстовый файл с именем stop в свой ExampleFolder.