Этот ответ не относится к кнопке «Отладка» (вам нужно создать форму и использовать кнопки для этого, чтобы сделать что-то похожее на метод в вашем следующем вопросе ). Но это относится к этой части:
теперь я не хочу терять удобство обработчика по умолчанию, который также указывает на точную строку, где произошла ошибка.
Во-первых, я предполагаю, что вы не хотите этого в рабочем коде - вы хотите это либо для отладки, либо для кода, который вы лично будете использовать. Я использую флаг компилятора, чтобы указать отладку; затем, если я устраню неполадки в программе, я могу легко найти строку, которая вызывает проблему.
# Const IsDebug = True
Sub ProcA()
On Error Goto ErrorHandler
' Main code of proc
ExitHere:
On Error Resume Next
' Close objects and stuff here
Exit Sub
ErrorHandler:
MsgBox Err.Number & ": " & Err.Description, , ThisWorkbook.Name & ": ProcA"
#If IsDebug Then
Stop ' Used for troubleshooting - Then press F8 to step thru code
Resume ' Resume will take you to the line that errored out
#Else
Resume ExitHere ' Exit procedure during normal running
#End If
End Sub
Примечание. Исключением из Resume
является то, что если ошибка возникает в подпроцедуре без подпрограммы обработки ошибки, то Resume
перенесет вас в строку этого процесса, которая вызвала подпроцедуру с ошибкой. Но вы все равно можете перейти к этой подпроцедуре и выполнить ее, используя F8 , пока она снова не выдаст ошибку. Если подпроцедура слишком длинная, чтобы сделать ее даже такой утомительной, то ваша подпрограмма, вероятно, должна иметь свою собственную процедуру обработки ошибок.
Есть несколько способов сделать это. Иногда для небольших программ, где я знаю, что я все равно буду проходить через них при устранении неполадок, я просто помещаю эти строки сразу после выражения MsgBox:
Resume ExitHere ' Normally exits during production
Resume ' Never will get here
Exit Sub
Он никогда не доберется до оператора Resume, если вы не пройдете и не установите его в качестве следующей строки для выполнения, либо перетаскивая указатель следующего оператора на эту строку, либо нажав Ctrl F9 с курсором на этой строке.
Вот статья, которая расширяет эти понятия: Пять советов по обработке ошибок в VBA . Наконец, если вы используете VBA и еще не обнаружили удивительный сайт Чипа Пирсона, у него есть страница, объясняющая Обработка ошибок в VBA .