Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Обработчик ошибки в цикле не работает. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Обработчик ошибки в цикле не работает.
Nikkei Дата: Понедельник, 09.09.2013, 16:07 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
Проблема следующего характера:
В цикле имеется обработчик ошибки (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:

On Error GoTo 0

GoTo Next_i

End Sub
[/vba]

Автор - Nikkei
Дата добавления - 09.09.2013 в 16:07
KuklP Дата: Понедельник, 09.09.2013, 16:18 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Дык, а зачем зацикливать ошибку? Ну в любом случае, обработчик стоит использовать правильно:
[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]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеДык, а зачем зацикливать ошибку? Ну в любом случае, обработчик стоит использовать правильно:
[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]

Автор - KuklP
Дата добавления - 09.09.2013 в 16:18
Nikkei Дата: Понедельник, 09.09.2013, 17:13 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
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 0
с = 3

Next

End Sub
[/vba]

Автор - Nikkei
Дата добавления - 09.09.2013 в 17:13
Саня Дата: Вторник, 10.09.2013, 10:06 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
[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 просто перенаправляет выполнение, не меняя статуса выполнения

[vba]
Код
Sub ajhf()
      On Error GoTo ErrorHendler1
      i = 2 / 0
        
ErrorHendler1:
      ' обработчик ошибок
      Debug.Print Err.Description     
            
      ' это уже не будет работать, попытка включения новой обработки ошибок из обработчика ошибок   
      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 просто перенаправляет выполнение, не меняя статуса выполнения

[vba]
Код
Sub ajhf()
      On Error GoTo ErrorHendler1
      i = 2 / 0
        
ErrorHendler1:
      ' обработчик ошибок
      Debug.Print Err.Description     
            
      ' это уже не будет работать, попытка включения новой обработки ошибок из обработчика ошибок   
      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]

Автор - Саня
Дата добавления - 10.09.2013 в 10:06
Nikkei Дата: Вторник, 10.09.2013, 20:11 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Саня, Большое спасибо, все работает. Благодарю за подробное объяснение.
 
Ответить
СообщениеСаня, Большое спасибо, все работает. Благодарю за подробное объяснение.

Автор - Nikkei
Дата добавления - 10.09.2013 в 20:11
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!