Code execution has been interrupted - что за баг?
Иногда при выполнении вполне рабочего кода может возникнуть ошибка "Code execution has been interrupted":
чаще всего она появляется в циклах (это Do ... Loop, For each, For ... Next). Но может проявится и на отдельных участках кода совершенно независимо от того, что делает тот или иной кусок кода. Сама по себе ошибка не является таковой - при нажатии Continue код продолжает работать и может даже дойти до конца уже без ошибок. Но что примечательно - появившись в каком-то коде однажды, эта ошибка начинает преследовать вас и при этом воспроизводится только на том ПК, на котором появилась. На других же ПК код может работать отлично и без всяких казусов.
Почему вообще появляется эта ошибка? Точный ответ на этот вопрос я, к сожалению, не дам. Только предположения: VBA тоже хранит всевозможные логи при работе и обращается к разным библиотекам. И скорее всего в какой-то момент этого хлама набирается так много, что VBE начинает "подглючивать" таким вот нестандартным образом, предполагая, что мы пытаемся выполнить параллельно два кода.
И главное: как ошибку Code execution has been interrupted устранить?
Я знаю два способа.
Способ 1 - разовый
Перед выполнением кода поставить строку:
Application.EnableCancelKey = xlDisabled
1 |
Application.EnableCancelKey = xlDisabled |
а после выполнения(перед End Sub или в любом месте, где может произойти выход из процедуры) её вернуть:
Application.EnableCancelKey = xlEnabled
1 |
Application.EnableCancelKey = xlEnabled |
чем не нравится данный метод мне лично: свойство EnableCancelKey отвечает за возможность обработки нажатия клавиш при выполнении кода. Значение xlDisabled переводит VBA в режим "глухой обороны" - т.е. он не будет реагировать ни на какие нажатия пока не завершится выполнение кода. Догадались, чем это чревато? Правильно: если вдруг попали в бесконечный цикл или захотели прервать выполнение - ничего не получится, т.к. сочетание Ctrl+Break будет просто проигнорировано.
Способ 2 - пожизненный(почти)
После появления ошибки нажмите Debug, затем Ctrl+Break, затем кнопку Play на панели редактора VBE (зеленый треугольничек воспроизведения кода) - продолжится выполнение кода. После этого ошибка должна исчезнуть.
Главное жать не F5 для продолжения выполнения, а именно треугольник на панели. Иначе может не сработать.
Если знаете еще способы устранения ошибки - делитель в комментариях - это обязательно поможет кому-то спасти нервы и силы и в карму вам плюсанется :)