Страница 1 из 1
Обработка событий Excel после вылета надстройки по ошибке
Добавлено: 13 июл 2008, 08:50
EducatedFool
Уважаемые знатоки!
Есть надстройка для Excel, которая обрабатывает события приложения.
Всё работает, но при вылете программы по ошибке
(обработка ошибок, конечно, присутствует, но всё не предусмотришь...),
когда юзер нажимает кнопку "End" в сообщении Excel об ошибке, обработка событий отключается.
(Все функции из созданных надстройкой меню продолжают работать).
Сразу признаюсь, что в обработке событий приложения разбираюсь плохо...
Вот имеющийся код:
При запуске надстройки выполняется: Private Sub Workbook_Open(): Set App.AppEv = Application: End Sub
В стандартном модуле происходит создание экземпляра класса: Public App As New ClassApp
Имеется модуль класса ClassApp со следующим кодом:
Public WithEvents AppEv As Application
Private Sub AppEv_NewWorkbook(ByVal Wb As Workbook)
' здесь происходит обработка события
End Sub
Я, конечно, вывел на панель инструментов кнопочку, которая выполняет код
Set App.AppEv = Application,
после чего обработка событий восстанавливается, но это ведь не выход...
Как сделать, чтобы обработка событий не прерывалась даже при вылете надстройки по ошибке?
может, по событию Class_Terminate() следует производить какие-либо действия?
Re: Обработка событий Excel после вылета надстройки по ошибке
Добавлено: 13 июл 2008, 10:28
Serge_Bliznykov
попробуйте заблокировать реакцию на ошибки через
On Error Resume Next
(эта строчка, написанная в начале модуля или фунции, означает, что при возникновении ошибки в данном модуле/функии, программа не прервётся, а продолжится со следующей строки после той, где возникла ошибка.
Хотя, такой подход чреват тем, что Вы просто запрещаете модулю реагировать на ВСЕ ошибки (неверные типы данных, выход за пределы диапазона, отсутствие нужныех файлов,книг,листов, имён и т.д. и т.п...
Re: Обработка событий Excel после вылета надстройки по ошибке
Добавлено: 13 июл 2008, 10:43
EducatedFool
On Error Resume Next - вариант, конечно, неплохой, но, учитывая количество функций (несколько сотен), найти ошибку потом будет весьма непросто...
Особенно учитывая, что проект на стадии отладки...
К тому же, есть множество ошибок, от которых Resume Next не спасает.
Вряд ли Excel сможет записать данные в несуществующий лист

а если и сможет, весьма сложно будет потом производить обработку данных из несуществующих ячеек
Можно, конечно, подключить вторую надстройку, в обязанности которой будет входить каким-либо образом запускать обработку ошибок в основной надстройке
(например, по командам от таймера на GetTickCount), но не факт, что после ошибки вторая надстройка будет продолжать работать. Да и некрасиво всё это получится...
К тому же, в процессе отладки (правки кода) приходится каждые несколько минут сохранять проект, что, опять же, тут же отключает обработку событий.
Основное событие, которое надо перехватить, - BeforeRightClick (основная функциональность доступна через контекстное меню).
Может есть способ отлавливать это событие как-то по-другому?
Re: Обработка событий Excel после вылета надстройки по ошибке
Добавлено: 13 июл 2008, 23:44
Teslenko_EA
Здравствуйте
EducatedFool.
"... но всё не предусмотришь...."
Есть время предусмотреть и "выловить" все возможные ошибки пока "творение" называется Проектом а не Приложением.

Вами созданный код дожен проверить наличие объекта (листа), и только потом к нему обращаться, не стоит надеятся на "Авось" если планируется создание полноценного продукта, иначе подобный вопрос бы не возник.
А значит без служебных процедур и функций не обойтись.
Например протоколирование ошибок :
Код: Выделить всё
Public Sub errLogger(lNum&, sDescr$, sProc$)
Dim FileNum%, sFile$
FileNum = FreeFile
sFile = ActiveWorkbook.Path & "\Errors.log"
'sFile = App.Path & "\Errors.log" ' при использовании VB
Open sFile For Append As FileNum
Write #FileNum, lNum, Chr(9) & sDescr, Chr(9) & sProc
Close FileNum
End Sub
в процедуры добавляются строки:
Код: Выделить всё
Sub Proc()
On Error Resume Next
...
...
If Not Err.Number = 0 Then
errLogger Err.Number, Err.Description, "Имя процедуры, ..."
Err.Clear
End If
End Sub
А после "вылавливания", уже Вам принимать решение, какие ошибки строит обрабатывать, а какие игнорировать (On Error Resume Next).
Евгений.
Re: Обработка событий Excel после вылета надстройки по ошибке
Добавлено: 14 июл 2008, 10:58
EducatedFool
Teslenko_EA,
Предусмотреть и "выловить"
все возможные ошибки даже Microsoft-у не всегда удаётся
Конечно, я пытаюсь предусмотреть все возможные варианты, пишу логи событий и ошибок (возможность появления которых предугадана заранее), и такого, чтобы, к примеру, записывать данные в несуществующий лист, конечно, не допускаю.
Конструкции типа On Error Goto ErrLabel я пытался использовать (где после метки ErrLabel стояла команда типа Msgbox Err.Number и всё такое), но вот ни разу почему-то не увидел "своего" сообщения об ошибке (ошибки встречались разные - как Run-Time Error, так и Application Defined Error), и всегда вылетало стандартное окно отладчика). Видимо, что-то я делал неправильно...
Или конструкция типа On Error Goto ErrLabel отлавливает действительно не все ошибки?
Ну вот, к примеру, почему не работает такой код?
Код: Выделить всё
Sub Trace2Left(ByRef Tr As Trace, ind As Integer)
[B]On Error Resume Next[/B]
SU False
Dim Shift As Integer: Shift = -1
Dim ac4 As Range: Set ac4 = ActiveCell.Worksheet.Cells(ActiveCell.Row, 4)
LogW "Trace2Left", "Ind = " & ind, az_Log_Default
Tr.Add_Node_from_Cell_Ref ac4, ind
ind = ind - 1
Do While ac4.Offset(0, Shift).HyperLinks.Count > 0
ac4.Offset(0, Shift).HyperLinks(1).Follow ' [B]здесь вылетает ошибка - "Run-time error - Не удаётся открыть файл"[/B] (файл я намеренно удалил)
If Err.Number <> 0 Then MsgBox Err.Description: Exit Do ' [B]до этого места выполнение кода не доходит[/B]
Set ac4 = ActiveCell.Worksheet.Cells(ActiveCell.Row, 4)
Tr.Add_Node_from_Cell_Ref ac4, ind
ind = ind - 1: If Shift = 5 Then Shift = -1 Else Shift = 5
Loop
SU True
End Sub
Re: Обработка событий Excel после вылета надстройки по ошибке
Добавлено: 14 июл 2008, 21:47
Teslenko_EA
Здравствуйте
EducatedFool.
Ошибка времени выполнения, тем более которую Вы создаете умышленно, совсем ничего не говорит о Microsoft.
А только о желании заставить Excel "...записать данные в несуществующий лист..."....
Код: Выделить всё
....
s = ac4.Offset(0, Shift).Hyperlinks(1)
If Len(Dir(s)) > 0 Then ...
двумя строками можно решить эту и подобные проблемы.
On Error... это "ограждение на крыше", защитит от случайного падения, но не убережет от желания спрыгнуть.

Евгений.
Re: Обработка событий Excel после вылета надстройки по ошибке
Добавлено: 14 июл 2008, 21:52
VictorM
Просто понравилось выражение
On Error... это "ограждение на крыше", защитит от случайного падения, но не убережет от желания спрыгнуть.
надо записать