Какой код VBA можно написать, чтобы гарантировать сообщение об ошибке «Microsoft Excel перестал работать»? - PullRequest
0 голосов
/ 13 декабря 2018

Я уверен, что это кажется странным вопросом, но один из моих клиентов испытывает проблемы со случайным аварийным завершением работы Excel и выдаёт сообщение об ошибке «Microsoft Excel перестал работать» (проблемное имя события: APPCRASH), в то время как моя программа на C # работаетиспользую Excel (незаметно), и я пытаюсь продублировать проблему, чтобы найти способ, с помощью которого моя программа может обработать сбой Excel.Поэтому мне нужен некоторый код VBA, который приведет к аварийному завершению работы Excel с событием APPCRASH.Я попробовал ниже, но это не вызовет сбой, если Excel не виден.Есть предложения?

Do
   x = 1
Loop

Вот сообщение об ошибке: enter image description here

Ответы [ 2 ]

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

Скорее всего, это проблема XY.

Чтобы решить эту проблему, не нужно выяснить какой-нибудь случайный код VBA, который дает вам аналогичную запись в журнале событий APPCRASH - никто этого не сделает.Или, если что-то случится, то вы все равно не узнаете ничего нового.

Чтобы решить эту проблему, нужно подключить отладчик VS к процессу EXCEL.EXE, воспроизвести шаги пользователя, а затем наблюдать за разрывом VSна необработанное исключение в коде C #.

Скорее всего, вы получаете где-то COMException, ваш экземпляр Excel внезапно умирает в результате и записывает APPCRASH, который является побочным эффектом возникшего исключениявне процесса, в управляемом коде, который породил процесс EXCEL.EXE.

Убедитесь, что ваш код C # правильно освобождает все COM-объекты, к которым он обращается (это все Worksheet, Range / ячейки,Worksheets коллекций, Application экземпляр) и не связывает вызовы членов объекта (что приводит к утечке памяти), например:

xlApp.Worksheets("foo").Range("A1").Value = 42;

Вышеприведенная утечка коллекции Worksheets, Worksheet экземпляр и Range для доступной ячейки.

Управляемая и COM-потоковая модели также не совсем совместимы, поэтому, если ваш код C # обращается к COM-объектам из несколькихeads, ожидайте COMException изобилие.


Первое, что нужно сделать, это воспроизвести проблему с подключенным отладчиком и посмотреть, вызывает ли ваш код C # исключение.Попытка найти код VBA, который может привести к сбою Excel, не поможет ни с чем.

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

Засунь свои руки в вещи, крути их, возьми что-нибудь мягкое и мягкое, а затем вырви.

Это должно сработать:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_WNDPROC As Long = (-4)

'SAVE YOUR WORK!
Private Sub BuhBye()
    Dim hWnd As Long
    hWnd = FindWindow(vbNullString, Application.Caption)
    SetWindowLong hWnd, GWL_WNDPROC, AddressOf OopsIDivedItAgain
End Sub

Public Function OopsIDivedItAgain(ByVal hWnd As Long, ByVal Msg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    OopsIDivedItAgain = 1 / 0
End Function

Это в основном подклассыглавное окно Excel и намеренно выбрасывает изнутри насос сообщений.

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