Добрый день! Проблема следующего характера: В цикле имеется обработчик ошибки (On Error GoTo ErrorHendler1). После его выполнения макрос следует по ссылке, проходит строку On Error GoTo 0. Затем при новом заходе на цикл снова проходится строка обработчика (On Error GoTo ErrorHendler1), но теперь уже обработка ошибки не срабатывает. Такое впечатление, что стрка On Error GoTo 0 больше не дает включиться обработчику. Пробовал перед обработчиком строку Err.Clear - ничего не дало
Подскажите пожалуйста как сделать что бы обработчик ошибки работал. Заранее благодарен.
[vba]
Код
Sub ajhf()
Next_i:
On Error GoTo ErrorHendler1 i = 2 / 0 a = 2 b = 3 ErrorHendler1:
On Error GoTo 0
GoTo Next_i
End Sub
[/vba]
Добрый день! Проблема следующего характера: В цикле имеется обработчик ошибки (On Error GoTo ErrorHendler1). После его выполнения макрос следует по ссылке, проходит строку On Error GoTo 0. Затем при новом заходе на цикл снова проходится строка обработчика (On Error GoTo ErrorHendler1), но теперь уже обработка ошибки не срабатывает. Такое впечатление, что стрка On Error GoTo 0 больше не дает включиться обработчику. Пробовал перед обработчиком строку Err.Clear - ничего не дало
Подскажите пожалуйста как сделать что бы обработчик ошибки работал. Заранее благодарен.
[vba]
Код
Sub ajhf()
Next_i:
On Error GoTo ErrorHendler1 i = 2 / 0 a = 2 b = 3 ErrorHendler1:
Дык, а зачем зацикливать ошибку? Ну в любом случае, обработчик стоит использовать правильно: [vba]
Код
Sub ajhf() Dim a, b, i On Error GoTo ErrorHendler1 Next_i: i = 2 / 0 a = 2 b = 3 On Error GoTo 0 Exit Sub ErrorHendler1: Resume Next ' или просто Resume, в зависимости от задачи. End Sub
[/vba]
Дык, а зачем зацикливать ошибку? Ну в любом случае, обработчик стоит использовать правильно: [vba]
Код
Sub ajhf() Dim a, b, i On Error GoTo ErrorHendler1 Next_i: i = 2 / 0 a = 2 b = 3 On Error GoTo 0 Exit Sub ErrorHendler1: Resume Next ' или просто Resume, в зависимости от задачи. End Sub
KuklP, Я прошу прощения за недостаточность изначальной информации. В данном случае вопрос не в зацикливании ошибки (даный пример создан искусственно), а только действии обработчика ошибски унутри цикла. Данный пример создан искусственно для того, что бы была видна ошибка. Приведенный ниже пример должно быть точнее выразит мысль. Суть та же.
Цель обработчика пропустить ряд строк в пределах цикла в случае возникновения ошибки. За тем цикл продолжает работу, но почему-то возникшая ранее ошибка ломает код при следующем (после ошибки) прохождении цикла.
[vba]
Код
Sub ajhf()
a = 1 For j = 1 To 10
If j > 4 Then a = 0
Err.Clear On Error GoTo ErrorHendler1 i = j / a b = 3 ' строка пропускаемая при возникновении ошибки ErrorHendler1:
On Error GoTo 0 с = 3
Next
End Sub
[/vba]
KuklP, Я прошу прощения за недостаточность изначальной информации. В данном случае вопрос не в зацикливании ошибки (даный пример создан искусственно), а только действии обработчика ошибски унутри цикла. Данный пример создан искусственно для того, что бы была видна ошибка. Приведенный ниже пример должно быть точнее выразит мысль. Суть та же.
Цель обработчика пропустить ряд строк в пределах цикла в случае возникновения ошибки. За тем цикл продолжает работу, но почему-то возникшая ранее ошибка ломает код при следующем (после ошибки) прохождении цикла.
[vba]
Код
Sub ajhf()
a = 1 For j = 1 To 10
If j > 4 Then a = 0
Err.Clear On Error GoTo ErrorHendler1 i = j / a b = 3 ' строка пропускаемая при возникновении ошибки ErrorHendler1:
On Error GoTo ErrorHendler1 i = 2 / 0 a = 2 b = 3 ErrorHendler1:
'On Error GoTo 0
Resume Next_i 'GoTo Next_i
End Sub
[/vba]
конструкция On Error GoTo ErrorHendler1 обеспечивает переход в обработчик ошибок, находящийся после метки ErrorHendler1 вернуться в основную часть кода (в нормальный режим) из обработчика можно только посредством инструкции Resume, GoTo просто перенаправляет выполнение, не меняя статуса выполнения
' это уже не будет работать, попытка включения новой обработки ошибок из обработчика ошибок On Error GoTo ErrorHendler2 i = 2 / 0
ErrorHendler2:
End Sub
[/vba]
а так можно: [vba]
Код
Sub ajhf() On Error GoTo ErrorHendler1 i = 2 / 0
ErrorHendler1: ' обработчик ошибок
Resume lblExitErrH1 ' выходим из обработчика 1
lblExitErrH1:
' будет работать On Error GoTo ErrorHendler2 i = 2 / 0
ErrorHendler2:
End Sub
[/vba]
[vba]
Код
Sub ajhf()
Next_i:
On Error GoTo ErrorHendler1 i = 2 / 0 a = 2 b = 3 ErrorHendler1:
'On Error GoTo 0
Resume Next_i 'GoTo Next_i
End Sub
[/vba]
конструкция On Error GoTo ErrorHendler1 обеспечивает переход в обработчик ошибок, находящийся после метки ErrorHendler1 вернуться в основную часть кода (в нормальный режим) из обработчика можно только посредством инструкции Resume, GoTo просто перенаправляет выполнение, не меняя статуса выполнения