Ошибка приложения Excel при открытии файла с макросами

Метки:  , , ,

Не так давно очередной раз столкнулся с ошибками приложения Excel при попытке включения макросов после открытия файлов .xlsm. Вспомнил, что подобные проблемы преследуют пользователей довольно давно, но чаще всего они наблюдались с Excel 2013 и Excel 2016. Характерные особенности этой группы ошибок следующие:

  • Приложение Excel закрывается при открытии файла с макросами (при включенном режиме безопасности Включить все макросы);
  • Ошибка приложения Excel возникает при попытке включить содержимое (нажатии соответствующей кнопки);
  • Ошибка приложения Excel возникает при сохранении файла с макросами;

Ну и по горячим следам очередного инцидента, дабы не откладывать на потом, решил для себя собрать небольшой хаб по ошибкам приложения Excel с последующей модификацией, дабы опять не терять время на поиск информации в Сети и на составление облака причин.
Суть в том, что в процессе открытия файла xlsm, и при отключенных макросах, в верхней части основного окна (над таблицей), высвечивается строка уведомления: ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен, с кнопкой включения содержимого (макросов). Как только пользователь её нажимает, Excel попросту аварийно завершается (падает) с ошибкой Программа Microsoft Excel не работает и характерным окном уведомления:

excel ошибка макроса

При этом было замечено, что непосредственно перед возникновением ошибки приложения Excel никаких системных обновлений и обновлений пакета Office не устанавливалось. Возможно, каким-то образом задействованы последние обновления на Office, но прямой связи я не заметил, а подробного исследования проблемы не проводил. При этом зависимости от версии операционной системы (мною лично сбои наблюдались на Windows 10 LTSC и Windows 7 Professional) так же выявлено не было. При анализе аварийного дампа приложения (*.hdmp) обычно можно увидеть подобную информацию исключения (вывод урезан):

обычно это NTSTATUS с кодом c0000005 - Access violation, доступ запрещен. И чаще всего в дампе можно увидеть такой вот стек потока (вывод оптимизирован для улучшения представления):

из которого единственное что понятно, так это то, что падение Excel происходит в недрах функций библиотеки vbe7.dll (среда исполнения VBA), подгруженной в адресное пространство процесса. Это указывает на проблемы с обработчиком VBA-скриптов, в контексте Excel чаще именуемых макросами.

НЕРЕШЕННОЕ: при отладке приложений из комплекта MS Office, вы не увидите имен функций в стеке вызовов, поскольку отсутствуют отладочные символы как к основным исполняемым файлам (Excel/Word/Outlook), так и к многочисленным библиотекам. Интересно, есть ли какое-либо решение?

VBA

Так что же такое VBA и для чего он предназначается?

VBA (Visual Basic for Application) - язык макропрограммирования, основанный на языке Visual Basic.

В приложениях, входящих в комплект MS Office, таких как Excel, Word, PowerPoint и Access, VBA используется для автоматизации множества рутинных задач (напр.: повторяющихся однотипных действий), позволяет создавать формы для общения с пользователем и предлагает множество иного богатого функционала. При помощи VBA доступно управление электронной таблицей посредством объектно-ориентированной модели кода/данных, при помощи VBA-кода входные данные таблиц могут быть обработаны и представлены в итоговых (результирующих) таблицах и диаграммах (графиках). Таблица становится интерфейсом кода, позволяя легко работать, изменять его и управлять расчётами. На выходе VBA проект, используемый в структурах описанных выше приложений (электронные таблицы Excel, презентации PowerPoint, базы Access), компилируется в специальный бинарный исполняемый файл, который размещается внутри файла основного формата. Применительно к Excel это файл vbaProject.bin, который располагается внутри *.xslm-файла в директории /xl, представляющий собой бинарный исполняемый файл проекта, содержащий макрос в откомпилированном (готовом к исполнению) виде.

Наиболее вероятной причиной сбоя является повреждение блока кода VBA, содержащегося в книге Excel. Об истоках этого остается только догадываться, возможно что в структуре .xlsm-файла, в процессе работы с документом, происходят какие-то [непредвиденные разработчиками] изменения, способные приводить блок кода в неработоспособное состояние.

Решение 1: вставка нового листа

Выполните приведенную последовательность действий:

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Добавляем в книгу Excel новый лист: правая кнопка мыши на ярлыках Лист1/Лист2/Лист3 → ВставитьЛист.
  4. Сохраняем электронную таблицу. Закрываем Excel.
  5. Открываем проблемный файл заново и включаем макросы.

Решение 2: перекомпиляция проекта

Выполните последовательность действий:

  1. Запускаем и открываем новую книгу Excel (не ваш проблемный файл).
  2. Открываем меню Файл - выбираем Параметры - далее открываем Центр управления безопасностью и заходим в Параметры центра управления безопасностью.
  3. В разделе Параметры макросов - выставляем чекбокс Отключить все макросы с уведомлением.
  4. В разделе Надежные расположения - выставляем чекбокс Отключить все надежные расположения.
  5. В разделе Надежные документы - выставляем чекбокс Отключить надежные документы.
  6. Жмем везде OK. Закрываем Excel.

  7. Открываем [проблемный] .xlsm-файл (файл с макросами).
  8. Не нажимаем кнопку Включить содержимое.
  9. Открывает редактор Visual Basic при помощи комбинации клавиш Alt+F11. Либо можно использовать обходной маневр: в настройках включаем меню Разработчик, после этого в появившемся сверху в ленте меню Разработчик выбираем пункт Visual Basic.
  10. В открывшемся окне редактора Visual Basic (VBA редактор) пересохраняем проект: для этого жмем на панели инструментов кнопку Сохранить (изображение дискетки или комбинация Ctrl+S).
  11. Выбираем из меню Debug - выбираем пункт меню Compile VBA Project:

    recompile vba project

  12. Еще раз сохраняем проект кнопкой Сохранить.
  13. Закрываем редактор Visual Basic.

  14. Сохраняем файл Excel через меню Файл - опцию Сохранить (или нажатием на значок дискетки в левом верхнем углу, либо комбинация клавиш Ctrl+S).
  15. Возвращаем все установки безопасности, сделанные на предыдущих шагах (пункты 2-5).
  16. Закрываем xlsm-файл.
  17. Заново открываем [проблемный] файл, в верхней части, в строке статуса - включаем макросы посредством кнопки Включить содержимое.

Решение 3: добавление модуля

Дополнительное решение состоит в том, что бы внести изменения в макрос без перекомпиляции.

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Открывает редактор Visual Basic (при помощи комбинации клавиш Alt+F11).
  4. Открываем меню Tools → пункт Options. В открывшемся окне переходим на вкладку General и деактивируем чекбокс Compile on Demand:

    compile on demand

    Закрываем окно Опции нажатием клавиши OK.

  5. В левом фрейме окна проекта (Project) спускаемся вниз, находим раздел Modules, жмем на нём правую кнопку → пункт InsertModule:

    vba insert module

  6. Далее просто закрываем окно редактора Visual Basic, сохраняем основной xslm-документ и закрываем Excel.
  7. Заново открываем [проблемный] файл, в верхней части, в строке статуса - включаем макросы посредством кнопки Включить содержимое.

Комментарии: 16

  1. Татьяна

    Решение 2 п.9 при открытии редактор Visual Basic,он не открывается а появляются сообщения: VBE6EXT.OLB could not be loaded .И при закрытии этого сообющения появляется следущее: Ont of memory

    1. einaare

      странно. восстановление офиса можно сделать, через Панель управления - Программы и компоненты. Какая версия офиса?

  2. Елена

    Спасибо большое за статью, мне потог спомоб номер 2, ещё раз спасибо автору!

  3. Ванчо в пончо

    Помогло РЕШЕНИЕ 2.
    НО
    Если файл с Макросами под защитой, а пароль вы НЕ знаете, то Visual Basic открывать не нужно. Просто сохраняете Файл и возвращаете настройки на место. Затем повторно открываете его без проблем

    1. einaare

      полезное дополнение, спасибо!!

  4. Зарема

    Спасибо большое! Второй способ помог

  5. Дмитрий

    Огромное спасибо автору! До третьего очередь не дошла. Первый не помог, второй помог.
    Первый способ помогал раньше при немного других каких-то проблемах. Причем был обнаружен абсолютно случайно методом тыка. Так что приведен здесь тоже не зря.
    Еще раз спасибо большое автору! Здорово, что есть подмога!!! Здоровья и удачи!

  6. Денис

    Спасибо! Ваша статья помогла быстро исправить казалось бы неисправимую проблему! Мне нужно было сделать пересчет с текущем макросом. Использовал простой способ 1.

  7. Наталья

    Спасибо за полезную статью!
    Жаль, но я испробовала все варианты, но ексель так и не работает. Закрывается при запуске активного содержимого.
    Я уже и ексель переустанавливала и винду, и надстроки все включила/отключала, и все настройки перепробовала и т.п.
    На других компьютерах файл работает без проблем, а у меня нетЪ :(
    У меня виндоус 10 и ексель не активированный - наверно, проблему я не там искала... )))

    1. einaare

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

  8. Алексей

    Спасибо. Помогло 1 решение. Просто ненавижу вторично писать макросы с обработкой баз данных.

  9. Иван

    Помог пункт 2.

    Большое спасибо автору!

  10. андрей

    Спасибо Спаситель.
    У меня вообще вис Эксель при загрузке.
    Спасло Решение 2 с перекомпиляцией.

  11. Александр

    Емое. Весь день промучался. Много чего перепробовал. Но помог именно этот, несложный на вид прием №2.
    Огромное спасибо автору!!!

  12. Михаил

    Спасибо огромное!
    По совету комментаторов использовал сразу второй способ, все работает!

  13. Лия

    Спасибо огромные . Второй способ мне помог!!!!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *