|
Обработка ошибок в VBA: Ctrl+Break не ловится, не растет кокос...
1) В Excel'е (MS Office 97) крутится макрос, обработка таблицы в цикле. Дело может быть долгим, поэтому резонно дать пользователю возможность прервать его выполнение. Ставится ловушка ошибок On Error, но нажатие Ctrl+Break не ловится. Ладно, пишется тестовая программа:
Sub ErrTrap()
On Error GoTo ErrHand
Err.Raise 18
Do
Loop
Exit Sub
ErrHand:
MsgBox Err.Number & vbCr & Err.Description
Resume Next
End Sub
В 3-й строке программно генерится ошибка с кодом 18 - «Произошло прерывание, вызванное пользователем», ловится нормально, управление передается обработчику. Управа возвращается в вызывающую программу, начинает крутиться мертвый цикл Do...Loop. Жмется Ctrl+Break или Esc - следует системное сообщение об ошибке «Выполнение программы прервано». Что за епть? Получается, Ctrl+Break генерит не 18 ошибку? А почему Ctrl+Break не ловится? А чем тогда вызывается 18 ошибка? И как тогда прерывать выполнение программы с клавиатуры?
2) В продолжение п. 1. Как альтернативу можно было сделать форму с кнопкой, при нажатии на которую прерывалось бы выполнение, да и индикатор выполнения не помешал бы, но в MS Office 97 все формы модальные. Можно ли все-таки как-то исхитриться и во время выполнения повесить диалоговое окно? Может быть, Win API может помочь?
3) А в MS Project 2000 ошибки вообще не ловятся, никакие - управление обработчику ошибок просто не передается. В той же самой тестовой программе из п. 1, перенесенной в модуль Project'а, все ошибки перехватываются внутренним обработчиком, но в программный не попадают. В чем причина-то...?
|