Приложение Excel VBA останавливается самопроизвольно с сообщением «Выполнение кода остановлено»

151

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

У нас есть несколько приложений Excel VBA, которые отлично работают на нескольких компьютерах пользователей. Однако на одной машине они останавливаются на определенных строках кода. Это всегда одни и те же линии, но эти линии, похоже, не имеют ничего общего друг с другом.

Если вы нажмете F5 (запустить) после остановки, приложение продолжит работу, так что это почти как точка останова. Мы попытались выбрать «удалить все разрывы» из меню и даже добавить разрыв и удалить его снова.

Раньше у нас была эта проблема с отдельными приложениями, и мы «решили» ее, вырезав код из модулей, скомпилировав и вставив его обратно и т. Д.

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

Любая помощь будет принята с благодарностью :)

Спасибо,

Филип Уиттингтон

Фил Уиттингтон
источник
2
Пользователь нажимает escape в середине любой обработки? Или любое другое приложение, которое отправляет escape-ключ?
Шахкальпеш
1
После выбора Удалить все точки останова вы также перекомпилировали и сохранили проект VBA? Я видел связанную проблему в Word VBA, где ранее удаленные точки останова все еще вызывают разрыв.
Дирк Воллмар
Ничего не обрабатывается во время казни, шахкалпеш. Divo - спасибо, возможно, я не пробовал их именно в таком порядке. Сделаем это сейчас ...
Фил Уиттингтон
В дополнение к комментарию divo, может быть полезно закомментировать соответствующие строки и любые строки, которые могут остановить отладку, затем их можно раскомментировать и перекомпилировать код (снова).
Fionnuala
И я забыл упомянуть: чтобы на самом деле вызвать перестроение, обычно необходимо изменить строку, а затем переместить курсор на следующую строку, чтобы пометить исходный код как измененный (например, внести изменения, переместить курсор вниз, переместить наведите курсор вверх и отмените изменение вручную)
Дирк Воллмар

Ответы:

405

Я нашел 2-е решение.

  1. Нажмите кнопку «Отладка» во всплывающем окне.
  2. Нажмите Ctrl+Pause|Break дважды.
  3. Нажмите кнопку воспроизведения, чтобы продолжить.
  4. Сохраните файл после завершения.

Надеюсь, это кому-нибудь поможет.

Стан
источник
12
+1: Вау, этот пост спас меня от мира боли. Очень неожиданное решение для странной проблемы. После двойного нажатия [Ctrl + Break] и продолжения я сохранил файл. После этого проблема больше не появлялась, когда я закрывал и заново открывал файл.
dbenham
28
Если когда-либо ответ заслуживал возражения, это оно. Отличный ответ.
The_Barman
4
Это мне очень помогло. Этот ответ заслужил 1000 голосов. Эта проблема меня мучила последние 4-5 дней. Это сработало отлично.
demouser123
25
Кто-нибудь знает, почему это работает? Или откуда это? Это волшебство?
ZX9
4
Все еще помогаю мне в 2017 году. Спасибо!
Плита
16

Эта проблема возникает из-за странной причуды в Office / Windows.

После разработки одного и того же фрагмента кода VBA и выполнения его буквально сотни раз за последние пару дней я столкнулся с этой проблемой только сейчас. Единственное, что изменилось, это то, что незадолго до того, как я столкнулся с этой проблемой, я случайно закончил выполнение кода VBA неортодоксальным методом.

Я удалил все временные файлы, перезагрузил и т. Д. Когда я снова запустил код после всего этого, у меня все еще возникла проблема - до того, как я вошел в первый цикл. Имеет смысл «нажать кнопку« Отладка »во всплывающем окне, затем дважды нажать [Ctrl + Break] и после этого продолжить без остановок» поскольку что-то в комбинации Office / Windows не освободило выполнение. Это застряло.

Избыточное действие Ctrl + Break, вероятно, разрешает длительное выполнение.

user2052260
источник
14

Одно из решений здесь :

Решением этой проблемы является добавление строки кода «Application.EnableCancelKey = xlDisabled» в первую строку вашего макроса. Это решит проблему, и вы сможете успешно выполнить макрос, не получая сообщение об ошибке «Код казнь была прервана ».

Но после того, как я вставил эту строку кода, я больше не мог использовать Ctrl + Break. Так что работает, но не сильно.

Стан
источник
Спасибо, Стэн - это, безусловно, решение, если ты испытываешь нехватку времени и просто хочешь, чтобы он работал! Очень полезно.
Фил Уиттингтон
1
Вы можете включить его в том же исполнении, установив его в xlInterrupt. (Это также автоматически повторно включает, когда выполнение кода заканчивается.) Ваш другой ответ сработал для меня, но в худшем случае это можно использовать как временное исправление. Более подробная информация о Application.EnableCancelKey
Kodithic
2
Правильный ответ - и единственный правильный ответ - выше. Вставка любой строки кода, включая «Application.EnableCancelKey = xlDisabled», просто переносит проблему на другую строку. Часто новая точка останова - это именно та строка, которую вы вставили. Единственная причина, по которой я не осуждаю ваш ответ, заключается в том, что я неоднократно прибегал к его использованию в течение последнего десятилетия.
Найджел Хеффернан
6

Я обнаружил, что нажатие Ctrl + Break в то время, когда макрос не работал, решило проблему.

Джеймс
источник
3

Я бы попробовал обычные корректирующие действия: - Запустите программу VBA Code Cleaner Роба Бови на своем коде VBA - Удалите все надстройки на ПК пользователя, особенно надстройки COM и .NET - Удалите все пользовательские файлы .EXD (несовместимости MSoft Update) - Запустите Excel Обнаружение и восстановление в системе пользователя - проверьте размер файла .xlb пользователя (должен быть 20-30 КБ) - Перезагрузите и удалите все временные файлы пользователя

Чарльз Уильямс
источник
2

Спасибо всем за их вклад. Эта проблема была решена выбором РЕМОНТА в Панели управления. Я предполагаю, что это явно перерегистрирует некоторые нативные COM-компоненты Office и выполняет то, что REINSTALL не делает. Я ожидаю, что последний только проходит контрольный список и иногда принимает то, что там, если это уже установлено, возможно. Затем у меня возникла отдельная проблема с регистрацией моей собственной .NET DLL для взаимодействия COM на компьютере пользователя (несмотря на то, что это также работает на других машинах), хотя я думаю, что это была моя ошибка, а не Microsoft. Еще раз спасибо, я действительно ценю это.

Фил Уиттингтон
источник
2

Я сталкивался с этой проблемой несколько раз при разработке одного сложного приложения Excel VBA. Иногда Excel начинал разбивать объект VBA совершенно случайно. И единственным выходом было перезагрузить машину. После перезагрузки Excel обычно начинает нормально работать.

Вскоре я обнаружил, что возможное решение этой проблемы - нажать CTRL + Break один раз, когда макрос НЕ работает. Может быть, это может помочь вам тоже.

bazinac
источник
2

У меня была эта проблема также при использовании Excel 2007 с книгой foobar.xlsm (с включенным макросом), которая получала бы «Выполнение кода было прервано», просто пытаясь закрыть книгу на красном крестике в правом углу без выполнения макросов все или любые макросы «инициализировать» формы, книги или рабочего листа. Опции, которые я получил, были «Конец» или «Продолжить», отладка всегда была серой. Я сделал, как предыдущий плакат предложил Панель управления-> Программы и компоненты-> щелкните правой кнопкой мыши «Microsoft Office Proffesional 2007» (в моем случае) -> изменить-> восстановить.

Это решило проблему для меня. Я мог бы добавить, что это произошло вскоре после обновления MS, и я также нашел в Excel надстройку под названием «Team Foundation» от Microsoft, которую я, конечно, не установил добровольно.

Карлито
источник
1

Я хотел бы добавить больше деталей к ответу Стэна # 2 по следующим причинам:

  • Я сам сталкивался с этой проблемой более десятка раз и, в зависимости от условий проекта, выбирал между волшебным ответом Стэна вуду №1 или №2. Когда я продолжаю сталкиваться с этим снова, я становлюсь более любопытным, чем это происходит в первую очередь.

  • Я хотел бы добавить ответ для пользователей Mac тоже.

  • Есть ограничения с обоими этими возможными ответами:

    • если код защищен (и вы не знаете пароль), тогда ответ № 1 не поможет.
    • если код не защищен, то ответ № 2 не позволит вам отладить код.

  1. Это может произойти по любой из следующих причин:

    • Операционная система не выделяет системные ресурсы процессу Excel. ( Решение: нужно просто запустить операционную систему - вероятность успеха очень низкая, но уже много раз работала)

    • P-код - это промежуточный код, который использовался в Visual Basic (до .NET) и, следовательно, он все еще используется в VBA. Это позволило более компактный исполняемый файл за счет более медленного выполнения. Почему я говорю о p-коде? Потому что иногда он поврежден между несколькими запусками и большими файлами или просто из-за установки программного обеспечения (Excel) где-то испортилось. Когда p-код искажает. выполнение кода продолжает прерываться. РешениеВ этих случаях предполагается, что ваш код начал повреждаться, и в будущем есть вероятность, что ваша книга Excel также будет повреждена, и вы получите сообщения типа «файл Excel поврежден и не может быть открыт». Следовательно, как быстрое решение, вы можете положиться на ответ № 1 или ответ № 2 в соответствии с вашими требованиями. Однако никогда не игнорируйте признаки коррупции. Лучше скопировать свои модули кода в блокноте, удалить модули, сохранить и закрыть книгу, закрыть Excel. Теперь снова откройте рабочую книгу и начните создавать новые модули с кодом, скопированным ранее в блокнот.

  2. Пользователи Mac, попробуйте любой из приведенных ниже вариантов, и они определенно будут работать в зависимости от архитектуры вашей системы, то есть ОС и версии Office.

    • Ctrl + Pause
    • Ctrl + ScrLk
    • Esc+ Esc(Нажмите дважды подряд)

Вы будете переведены в режим прерывания с использованием вышеуказанных комбинаций клавиш, поскольку макрос приостанавливает выполнение, немедленно завершая текущую задачу. Это замена шага 2.

  1. Решение: Чтобы преодолеть ограничение использования ответа № 1 и ответа № 2 , я использую xlErrorHandlerвместе с Resumeоператором в обработчике ошибок, если код ошибки равен 18. Затем прерывание отправляется в запущенную процедуру как ошибка, которую можно перехватить по ошибке обработчик настроен с помощью оператора On Error GoTo. Trappable код ошибки - 18. Текущая процедура прервана, и пользователь может отладить или завершить процедуру. Microsoft предупреждает, что не используйте это, если ваш обработчик ошибок имеет оператор возобновления, иначе ваш обработчик ошибок всегда возвращается к одному и тому же утверждению. Это именно то, что мы хотим от нежелательных бессмысленных прерываний выполнения кода.

jainashish
источник
0

Моя текущая репутация пока не позволяет публиковать это как комментарий. Решение Stans, чтобы войти в режим отладки, дважды нажмите Ctrl + Break, играть дальше, сохранить действительно решил мою проблему, но у меня есть два неожиданных поворота:

  1. Мой проект защищен паролем, поэтому, чтобы войти в режим отладки, мне сначала нужно было войти в режим разработчика, нажать на структуру проекта и ввести пароль.

  2. Мой проект - это файл шаблона (.xmtl). Я открыл файл с помощью двойного щелчка, который открывает его как .xml с «1» в конце предыдущего имени файла. Я исправил ошибку как по инструкции Stans и сохранил ее как ... 1.xml файл. Когда я снова открыл шаблон, на этот раз как шаблон, и захотел применить то же исправление ошибки к этому файлу, ошибка исчезла! Я не изменил этот файл и до сих пор нет ошибок при выполнении макроса. Для меня это означает, что ошибка на самом деле не в файле, а в (скрытой) настройке в Excel.

blablubbb
источник
-1

Теперь проблема, похоже, связана с самим Excel

Переустановите и исправьте это :) Другое тогда, что это трудно сказать.

Энди
источник
Мы попытались переустановить, хотя пользователь «забыл» перезагрузиться после того, как парень поддержки сделал свое дело. Пытаюсь избежать повторной переустановки Office, но это может быть неизбежно ... Спасибо
Фил Уиттингтон