Приложение Excel VBA останавливается самопроизвольно с сообщением «Выполнение кода остановлено» - PullRequest
133 голосов
/ 28 января 2010

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

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

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

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

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

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

Спасибо

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

Ответы [ 11 ]

376 голосов
/ 28 апреля 2011

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

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

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

15 голосов
/ 08 февраля 2013

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

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

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

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

13 голосов
/ 28 апреля 2011

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

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

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

5 голосов
/ 09 февраля 2013

Я обнаружил, что нажатие ctrl + break, пока макрос не работал, решило проблему.

3 голосов
/ 28 января 2010

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

2 голосов
/ 04 декабря 2012

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

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

2 голосов
/ 20 апреля 2012

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

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

2 голосов
/ 28 января 2010

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

1 голос
/ 07 июня 2018

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

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

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

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

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

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

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

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

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

    • Ctrl + Пауза
    • Ctrl + ScrLk
    • Esc + Esc (нажмите дважды последовательно)

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

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

0 голосов
/ 18 ноября 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...