Как предотвратить ошибку Excel VBA: необработанное исключение win32 произошло в EXCEL.EXE [14756] - PullRequest
0 голосов
/ 02 ноября 2018

Клиент, на котором я работаю, недавно обновил все ноутбуки до 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 ID отчета: 74d9c093-61f0-4616-b20b-dc7f2acda9a5 Полное имя неисправного пакета: Неправильный идентификатор приложения, относящегося к пакету:

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

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

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

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

1 Ответ

0 голосов
/ 14 декабря 2018

Спасибо @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-bit-and-64-bit-versions-of-office

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

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

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

(См. Статью базы знаний: https://support.microsoft.com/en-gb/help/4011597/december-5-2017-update-for-excel-2013-kb4011597) Они объяснили, что это исправление, разработанное Microsoft, чтобы заставить 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 решило проблему.

...