Иногда при выполнении вполне рабочего кода может возникнуть ошибка "Code execution has been interrupted": В текущей статье разбирается ситуация, когда данное сообщение появляется совершенно самостоятельно - никто никаких кнопок не нажимает, специально выполнение кода не прерывает(нажатиями клавиш Ctrl+Break или Esc и т.п.).
Чаще всего она появляется в циклах (это Do ... Loop, For each, For ... Next). Но может проявится и на отдельных участках кода совершенно независимо от того, что делает тот или иной кусок кода. Сама по себе ошибка не является таковой - при нажатии Continue код продолжает работать и может даже дойти до конца уже без ошибок. Но что примечательно - появившись в каком-то коде однажды, эта ошибка начинает преследовать вас и при этом воспроизводится только на том ПК, на котором появилась. На других же ПК код может работать отлично и без всяких казусов.
Почему вообще появляется эта ошибка? Точный ответ на этот вопрос я, к сожалению, не дам. Только предположения: VBA тоже хранит всевозможные логи при работе(в том числе при отладке и пошаговом выполнении кода) и обращается к разным библиотекам. И скорее всего в какой-то момент этого хлама набирается так много, что VBE начинает "подглючивать" таким вот нестандартным образом, предполагая, что мы нажали сочетание клавиш для прерывания кода и входа в режим отладки.
И главное: как ошибку Code execution has been interrupted устранить?
Я знаю два способа. Способ 1 - разовый
Перед выполнением кода поставить строку:
Application.EnableCancelKey = xlDisabled
Application.EnableCancelKey = xlDisabled
а после выполнения(перед End Sub или в любом месте, где может произойти выход из процедуры) её вернуть:
Application.EnableCancelKey = xlInterrupt
Application.EnableCancelKey = xlInterrupt
чем не нравится данный метод мне лично: свойство EnableCancelKey отвечает за возможность обработки нажатия клавиш при выполнении кода. Значение xlDisabled переводит VBA в режим "глухой обороны" - т.е. он не будет реагировать ни на какие нажатия пока не завершится выполнение кода. Догадались, чем это чревато? Правильно: если вдруг попали в бесконечный цикл или захотели прервать выполнение - ничего не получится, т.к. сочетание Ctrl+Break будет просто проигнорировано.
Способ 2 - пожизненный(почти)
После появления ошибки нажмите Debug, затем Ctrl+Break, затем кнопку Play на панели редактора VBE (зеленый треугольничек воспроизведения кода) - продолжится выполнение кода. После этого ошибка должна исчезнуть.
Главное жать не F5 для продолжения выполнения, а именно треугольник на панели. Иначе может не сработать.
Т.к. из многих ноутбуков стали зачем-то "выпиливать" кнопку Break, сочетание Ctrl+Break совершить становится очень сложно :)
На некоторых ноутбуках для прерывания кода срабатывает одно из следующих сочетаний:
Ctrl+B
Ctrl+Fn+B
Fn+F11
где Fn - клавиша, которая включает режим дополнительных функций.
Если и эти сочетания не дают эффекта, можно попробовать иным методом. Как только появилась ошибка "Code execution has been interrupted" жмем Debug. А т.к. нет клавиши Break - после этого идем в меню VBE: Debug -Step Into. Затем кнопку Play на панели редактора VBE (зеленый треугольничек воспроизведения кода) - продолжится выполнение кода.
Если знаете еще способы устранения ошибки - делитесь в комментариях - это обязательно поможет кому-то спасти нервы и силы и в карму вам плюсанется :)
Евгений, Вы бы статью прочитали для начала, прежде чем комментарий оставлять :) Этот баг проявляется редко и ни о каком режиме отладки речи не идет. Рассматривается ситуация, когда код просто запущен стандартным методом или через кнопку и появляется данная ошибка.
Ситуация действительно похожа на какой-то глюк отладчика VBA. Запускаем макрос по F5, нажимаем Ctrl+Pause, Debug, перезапускаем по F5 или кнопке Play - получаем ошибку с остановкой в произвольных местах. Никакое количество последовательностей "Debug, Ctrl+Pause, F5" не помогает, но при замене F5 на Play срабатывает. Перезапуск Excel не помогает, перезагрузка Win помогает (если правильно помню).
Спасибо огромное!
Спасибо. Второй способ помог. Не представляю как можно было досооброжать до такого неочевидного решения)
Это режим отладки включенный.
Попробуйте прожать еще раз Ctrl+Break
Евгений, Вы бы статью прочитали для начала, прежде чем комментарий оставлять :) Этот баг проявляется редко и ни о каком режиме отладки речи не идет. Рассматривается ситуация, когда код просто запущен стандартным методом или через кнопку и появляется данная ошибка.
Ситуация действительно похожа на какой-то глюк отладчика VBA. Запускаем макрос по F5, нажимаем Ctrl+Pause, Debug, перезапускаем по F5 или кнопке Play - получаем ошибку с остановкой в произвольных местах. Никакое количество последовательностей "Debug, Ctrl+Pause, F5" не помогает, но при замене F5 на Play срабатывает. Перезапуск Excel не помогает, перезагрузка Win помогает (если правильно помню).
Выручили!
Спасибо! Способ №2 помог!
Блеск!!! Очень помогло и спасло много сил и времени!!!
Супер! Большое Вам спасибо!!!
PS: способ №2
Спасибо! Способ №2 рабочий!