Excel сбои периодически при нажатии кнопки макроса в быстрой последовательности - PullRequest
0 голосов
/ 21 июня 2019

При быстром последовательном нажатии кнопки макроса VBA (не кнопки AcitveX) Excel «иногда» вылетает.

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

Это супер расстраивает, потому что это периодически.Может быть, 1 из 10-20 раз.

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

Я просто надеюсь, что кто-то еще столкнулся с быстрым выполнением макросов, приводящим к сбою Excel.Опять же, код VBA работает нормально, похоже, это проблема Excel более высокого уровня?

Public Sub Clicked_UpdateWall_C()
    Dim Wall As New CWall_C
    Dim ExecutionSuccess As Boolean
    Dim errstr As String

    ExecutionSuccess = CheckUnits(ActiveSheet.Name, errstr)

    If ExecutionSuccess Then ExecutionSuccess = Wall.UpdateWall(ActiveSheet.Name, errstr)

    Call CheckError(ExecutionSuccess, errstr)

    ' This is an attempt to force excel to do garbage collection
    Set Wall = Nothing
End Sub

Сообщение об ошибке «Excel прекратил работать», а не ошибка времени выполнения VBA.Можно нажать кнопку «перезагрузить Excel» в диалоговом окне с сообщением об ошибке, и Excel перезапустится, и, как правило, большую часть времени вы не теряете работу.

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

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Мне удалось решить проблему, выполнив две вещи:

  1. Переключен с «Элемент управления формы кнопки» на «Элемент управления ActiveX кнопки управления».Я догадывался, что элемент управления ActiveX является более надежным с точки зрения обработки быстрых кликов.Оказалось, что это правда.
  2. Добавлена ​​функция DoEvents в конец обработчика событий элемента управления ActiveX кнопки управления.Это в значительной степени устранило проблему на 99,9%, если только кто-то не делает глупости, нажимая кнопку.Смысл в том, что это дало Excel время для обработки любых выдающихся событий, которые, возможно, не были обработаны должным образом из-за быстрых нажатий кнопок.

Спасибо всем, кто ответил положительными комментариями и предложениями.

0 голосов
/ 21 июня 2019

Когда кнопка макроса VBA (а не кнопка AcitveX) нажата в быстрой последовательности Excel, иногда происходит сбой.

Выстрел в темноте. Попробуй это. Поставьте свой код вместо '~~> Rest of your code. Теперь независимо от того, сколько раз вы нажмете подряд, ничего не произойдет.

Option Explicit

Dim DoNotRunProc As Boolean

Public Sub Clicked_UpdateWall_C()
    If DoNotRunProc = True Then Exit Sub

    DoNotRunProc = True

    On Error GoTo Whoa

    '
    '~~> Rest of your code
    '

Whoa:
    DoNotRunProc = False
End Sub

Примечание. Если в вашем коде есть отдельный обработчик ошибок, измените код выше соответствующим образом.

...