Как предотвратить ошибку Excel VBA: необработанное исключение win32 произошло в EXCEL.EXE [14756]

Клиент, над которым я работаю, недавно обновил все ноутбуки до Microsoft Surface под управлением Windows 10 (версия 10.0.16299) и Office 2016: Microsoft Excel 2016 MSO (16.0.9126.2295) 64-разрядной версии Microsoft Office 365 ProPlus

Я работаю над приложением Excel VBA, которое нормально работало на старых ноутбуках, но теперь начало сбой Excel со следующей ошибкой: Необработанное исключение win32 произошло в EXCEL.EXE [14756]

При сбое Excel появляются различные диалоговые сообщения: Microsoft Excel перестала работать Отчеты об ошибках Windows перестали работать

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

Имя сбойного приложения: EXCEL.EXE, версия: 16.0.9126.2295, отметка времени: 0x5bafc794 Имя сбойного модуля: MSCOMCTL.OCX, версия: 0.0.0.0, отметка времени: 0x5984a51c Код исключения: 0xc0000005 Смещение ошибки: 0x0000000000021f8f Идентификатор сбойного процесса : 0x42c8 Время запуска сбойного приложения: 0x01d47124a3a41f4c Путь сбойного приложения: C: \ Program Files \ Microsoft Office \ Root \ Office16 \ EXCEL.EXE Путь сбойного модуля: C: \ windows \ system32 \ MSCOMCTL.OCX Идентификатор отчета: 74d9c093-61f0-4616 -b20b-dc7f2acda9a5 Полное имя сбойного пакета: Идентификатор приложения, относящегося к сбойному пакету:

Я искал на многочисленных форумах решения, используя собранную мной информацию, и пока ничего не нашел.

Я изолировал проблему от конкретного действия пользователя, щелкнув элемент управления ListView. Этот элемент управления был добавлен в приложение, чтобы заменить прежний элемент управления Listbox в форме, чтобы можно было установить красный цвет шрифта там, где был выбран элемент. После перехода на ноутбуки Surface этот элемент управления ListView, похоже, вызывает конфликт, который приводит к сбою Excel. Я не могу быть более уверенным, чем это. Отключение элемента управления ListView и настройка приложения для использования элемента управления ListBox, похоже, решили проблему.

Я надеюсь, что это поможет другим. Если кто-нибудь может объяснить, почему на самом деле происходит сбой Excel, я был бы признателен, поскольку я чувствую, что у меня есть обходной путь, а не исправление.

Мне интересно, есть ли конфликт с 64-битными v 32-битными драйверами / dll-файлами. Используются следующие ссылки VBA: Ссылки VBA Отметить


person Frozbie    schedule 02.11.2018    source источник
comment
Я полагаю, вы использовали 32-битную версию элемента управления listview и заявляете, что у пользователей есть 64-битный Office. Я ожидаю, что это основная причина.   -  person jkpieterse    schedule 02.11.2018
comment
Кажется, я упускаю вопрос здесь. Почему происходит сбой в работе 64-разрядного Excel при использовании устаревшего 32-разрядного элемента управления 20-летней давности? В этом случае ответ находится в вашем отчете об ошибке - 0xc0000005 - нарушение прав доступа.   -  person Comintern    schedule 02.11.2018
comment
@jkpieterse Спасибо за это, я посмотрю, есть ли 64-битная версия.   -  person Frozbie    schedule 03.11.2018
comment
@Comintern Вы, кажется, знаете больше о кодах ошибок, чем я. Я вижу, возможно, шесть кодов ошибок в журнале Windows, который я опубликовал, и открыто признаю, что не знаю, какие из них актуальны или полезны с точки зрения выявления проблемы и решения. Я не понимал, что MSCOMCTL.OCX - это файл, упомянутый в ссылках VBA, который помогает подтвердить, какой файл драйвера / справочного файла является проблемой.   -  person Frozbie    schedule 03.11.2018


Ответы (2)


Спасибо @jkpieterse и @Comintern за совет.

Причины проблемы были определены как переход на 64-разрядную версию Excel 2016 при использовании 32-разрядных элементов управления и кода VBA.

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

1) Удаление всего кода и объектных ссылок на объект ListView.

2) Следуя рекомендациям в этой статье Microsoft для обеспечения совместимости VBA с 64-разрядной версией Office 2016: https://docs.microsoft.com/en-us/office/client-developer/shared/compatibility-between-the-32-битныеи64-битные-версии-офиса

3) В конечном итоге мы связались со службой поддержки Microsoft, которая порекомендовала, чтобы во избежание сбоя Excel, мы установили новый раздел реестра в:

HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Office \ 16.0 \ Excel \ Параметры \

Имя: ForceVBALoadFromSource Тип: DWORD
Значение = 1

(См. Статью в базе знаний: https://support.microsoft.com/en-gb/help/4011597/deDecember-5-2017-update-for-excel-2013-kb4011597) Они объяснили, что это исправление, которое Microsoft накатила. out, чтобы заставить Excel полностью компилировать VBA в 64-битных системах, что предотвращает проблемы при частичной компиляции 32-битного кода.

Очевидно, вам следует сделать резервную копию реестра и создать точку восстановления перед применением этого исправления (и обратитесь в технический отдел, если он у вас есть!)

До обращения в службу поддержки я сузил точку сбоя до вызова определенной формы. До этого момента код VBA работал нормально, соединение ADODB было успешно выполнено с базой данных SQL Server с возвращаемыми данными. При вызове формы приложение вылетало. Если я загрузил другую форму, приложение не аварийно завершило работу, что означает наличие других элементов управления или кода, вызывающих ошибку компиляции или конфликт.

Кроме того, я обнаружил, что приложение не аварийно завершает работу, если окно редактора Visual Studio уже было открыто. Мне удалось добавить строку кода, чтобы программно открыть окно VBE (плюс некоторые, чтобы изменить его размер, чтобы оно не скрывало форму):

Application.VBE.MainWindow.Visible = True
With Application.VBE.MainWindow
    .Width = 500
    .Height = 500
End With

После добавления этого кода приложение тоже не вылетало.

Форма задачи была слишком сложной, чтобы ее можно было воссоздать без значительных затрат на разработку. К счастью, исправление Microsoft решило проблему.

person Frozbie    schedule 14.12.2018

Недавно у меня была аналогичная проблема сбоя при вызове подпрограммы из надстройки. Код работал нормально при отладке вручную. Мы используем 32-битную версию Excel 2016. Я понял, что проблема связана с некомпилированным кодом надстройки. После перекомпиляции всего кода с помощью отладки - ›Скомпилировать VBAProj из редактора VBA ошибка исчезла.

person Sarav    schedule 06.01.2021