powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка ошибки
24 сообщений из 24, страница 1 из 1
Обработка ошибки
    #34889486
vad-anatolij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Написал макрос, в котором ищу слово "цех".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Sub макрос333()
On Error GoTo err_91
'Вставляем верхнюю пустую строку
        Rows("1:1").Select
    Selection.Insert Shift:=xlDown
PravSt =  10 
shir =  1 
While shir < PravSt
Range(Cells( 1 , shir), Cells( 20 , shir)).Select
Set videlen = Selection.Find(What:="цех", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
MsgBox videlen.Address
        Wend
err_91:
If Err.Number =  91  Then
MsgBox "Нет"
End If
End Sub
Проблема в том, что когда слово "цех" нет в искомой области, тогда появляется обшибка 91. Решил обработать ее, но тогда прерывается цикл.
Как обрабатывать ошибку, не разрывая цикла.
Спасибо.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34889534
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
....оооо чорт! У меня сегодня абсолютно такой же вопрос возник!!! - маялся полдня, в итоге обошелся конструкцией Resume Next. Помогло, но этот вопрос оставил осадок на душе моей.
Люди добрые, расскажите нам про обработку ошибок в цикле!
...
Рейтинг: 0 / 0
Обработка ошибки
    #34890181
mari_karo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы переделала код так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub макрос333()
Rows("1:1").Insert Shift:=xlDown
PravSt =  10 
shir =  1 

While shir < PravSt
Set videlen = Range(Cells( 1 , shir), Cells( 20 , shir)).Find(What:="цех", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)
      If Not videlen Is Nothing Then
        MsgBox videlen.Address
      Else
        MsgBox "Нет"
      End If
Wend

End Sub

А вообще по поводу ошибок возможны два варианта:
1. Игнорируем ошибку и разрешаем VBA продолжить выполнение программы (On Error Resume Next)
2. Переходим к разделу кода для обработки ошибок. (On Error GoTo МЕТКА). (Как у вас и было в примере)
Оператор On Error GoTo 0 восстанавливает нормальную обработку ошибок.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34890256
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Код: plaintext
1.
2.
3.
Range(Cells( 1 , shir), Cells( 20 , shir)).Select
Set videlen = Selection.Find(What:="цех", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

не надо так делать (много проблем может быть)
надо так
Код: plaintext
1.
2.
Set videlen = Range(Cells( 1 , shir), Cells( 20 , shir)).Find(What:="цех",  LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
обратите внимание я убрал параметр After
также и
Код: plaintext
1.
Rows("1:1").Select
    Selection.Insert Shift:=xlDown
надо так
Код: plaintext
Rows("1:1").Insert Shift:=xlDown
2. если вы ставите условие
Код: plaintext
While shir < PravSt
то д.б. изменения в цикле (иначе зацикливание)
наверно предполагалось так

Код: plaintext
1.
shir  = shir +  1 
Wend
3. В методе Find параметр "SearchFormat" появился только в XP поэтому, если вы попытаетесь воспользоваться этим методом c этим параметром на 2000-ом и ниже, то неменуемо будет ошибка (448).
Рекомендую опустить этот параметр (по умолчанию он все равно false)
Код: plaintext
1.
2.
Set videlen = Range(Cells( 1 , shir), Cells( 20 , shir)).Find(What:="цех",  LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False)
4. ошибка 91 появляется не в момент присвоения значения переменной "videlen" (Set videlen = Selection.Find(...)), а позже, когда вы пытаетесь ообратиться к ней (MsgBox videlen.Address).
Проверьте переменную на Nothing, прежде чем обращаться к ней
Код: plaintext
1.
2.
3.
4.
5.
6.
Set videlen = Range(Cells( 1 , shir), Cells( 20 , shir)).Find(What:="цех",  LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not videlen Is Nothing Then
    MsgBox videlen.Address
Else
    MsgBox """цех"" не найден", vbCritical
End If
5. теперь о цикле
нет смысла организововать цикл в таком виде как у вас поскольку есть метод "FindNext"
попробуйте разобраться в нем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        Set videlen = Worksheets( 1 ).Range("a1:a50").Find(What:="цех", LookIn:=xlValues, _
            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False)
        If Not videlen Is Nothing Then
            firstAddress = videlen.Address
            Do
                MsgBox videlen.Address
                Set videlen = Worksheets( 1 ).Range("a1:a50").FindNext(videlen)
            Loop While videlen.Address <> firstAddress
        Else
            MsgBox """цех"" не найден", vbCritical
        End If
...
Рейтинг: 0 / 0
Обработка ошибки
    #34890438
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... а про обработчики ошибок в цикле так никто ничего и не сказал :/
Почему вот так у меня не работает? Совсем запутался...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub prodata()
Dim i As Byte

Do
    On Error GoTo ErrorData
    Sheets( 1 ).PivotTables("Turnover").PivotCache.Refresh
NextCode:
i = i +  1 
Loop Until i >  10 

Exit Sub

ErrorData:
GoTo NextCode
End Sub
...
Рейтинг: 0 / 0
Обработка ошибки
    #34892041
lena_###
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LETME
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub prodata()
  Dim i As Byte
  Do
    On Error Resume Next
    Sheets( 1 ).PivotTables("Turnover").PivotCache.Refresh
    If Err.Number <>  0  Then
      Debug.Print i; Tab; Err.Number; Tab; Err.Description
      Err.Clear
    End If
    On Error GoTo  0 
    i = i +  1 
  Loop Until i >  10 
End Sub
...
Рейтинг: 0 / 0
Обработка ошибки
    #34893202
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lena_###, спасибо!
Однако, это не совсем то. Хотелось бы понять - почему в моем примере при втором проходе в цикле не срабатывает On Error GoTo ErrorData.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34893801
Chelovek Tapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LETME
Хотелось бы понять - почему в моем примере при втором проходе в цикле не срабатывает On Error GoTo ErrorData.


У меня тоже были вопросы на эту тему, но поскольку так заложено, что при втором проходе не срабатывает, то я обычно это избегаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub prodata()
Dim i As Byte

Do
    On Error Resume Next
    Sheets( 1 ).PivotTables("Turnover").PivotCache.Refresh
    On Error GoTo  0 
    i = i +  1 
Loop Until i >  10 
End Sub
...
Рейтинг: 0 / 0
Обработка ошибки
    #34895282
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LETMElena_###, спасибо!
Однако, это не совсем то. Хотелось бы понять - почему в моем примере при втором проходе в цикле не срабатывает On Error GoTo ErrorData.Потому что обработка ошибки не рекурсивна. Ошибка случившаяся в обработчике ошибки не перехватывается.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34895297
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Chelovek TapokУ меня тоже были вопросы на эту тему, но поскольку так заложено, что при втором проходе не срабатывает, то я обычно это избегаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub prodata()
Dim i As Byte

Do
    On Error Resume Next
    Sheets( 1 ).PivotTables("Turnover").PivotCache.Refresh
    On Error GoTo  0 
    i = i +  1 
Loop Until i >  10 
End Sub
Так делать можно, но бессмысленно. Твой макрос по работе ничем не будет отличаться от такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub prodata()
Dim i As Byte

On Error Resume Next
Do
    Sheets( 1 ).PivotTables("Turnover").PivotCache.Refresh
    i = i +  1 
Loop Until i >  10 
On Error GoTo  0 
End Sub
Включение/выключение обработчика в цикле только занимает лишнее время.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897255
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LETMEХм... а про обработчики ошибок в цикле так никто ничего и не сказал :/
Почему вот так у меня не работает? Совсем запутался...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub prodata()
Dim i As Byte

Do
    On Error GoTo ErrorData
    Sheets( 1 ).PivotTables("Turnover").PivotCache.Refresh
NextCode:
i = i +  1 
Loop Until i >  10 

Exit Sub

ErrorData:
GoTo NextCode
End Sub

есть выход
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub prodata()
    Dim i As Byte
    
    Do
        prodata1 i
        i = i +  1 
    Loop Until i >  10 
    
End Sub
Sub prodata1(i As Byte)
    On Error GoTo ErrorData
    Sheets(i).PivotTables("Turnover").PivotCache.Refresh
Exit Sub
ErrorData:
    MsgBox i
End Sub
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897265
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хммм... а это действительно рабочий вариант!
vkodor, спасибо!
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897320
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Sub witherr()
    On Error GoTo wrong
    For i =  1  To n
        something to do
    Next i
wrong:
    Select Case Err.Number
    Case  0 
    Case Nerr1
        correct
        Resume
    Case Nerr2
        passover
        Resume Next
    Case Else
        MsgBox Err.Description, , "witherr " & Err.Number
    End Select
End Sub
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897397
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To LeonM
можно пояснить
To Do - это что?
Вы уверены что это VBA?
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897440
Chelovek Tapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub prodata()
Dim i As Byte

On Error Resume Next
Do
    Sheets( 1 ).PivotTables("Turnover").PivotCache.Refresh
    i = i +  1 
Loop Until i >  10 
On Error GoTo  0 
End Sub
Включение/выключение обработчика в цикле только занимает лишнее время.

Полностью согласен, но я писал включение/выключение обработчика в цикле из расчета, что там может быть еще какая-либо обработка, игнорирование ошибок которой недопустимо.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897652
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodorTo LeonM
можно пояснить
To Do - это что?
Вы уверены что это VBA?

)) vkodor, Вы это серьезно спрашивате???
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897779
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LETME vkodorTo LeonM
можно пояснить
To Do - это что?
Вы уверены что это VBA?

)) vkodor, Вы это серьезно спрашивате???
Вообще-то да.
Открыл Excel
открыл VBA
скопировал код
строка
Код: plaintext
        something to do
светится
открыл ворд ... тоже самое
открыл Access, PowerPoint тоже самое
дальше проверять не стал
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897833
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodor LETME vkodorTo LeonM
можно пояснить
To Do - это что?
Вы уверены что это VBA?

)) vkodor, Вы это серьезно спрашивате???
Вообще-то да.
Открыл Excel
открыл VBA
скопировал код
строка
Код: plaintext
        something to do
светится
открыл ворд ... тоже самое
открыл Access, PowerPoint тоже самое
дальше проверять не стал
На этом месте должны стоять Ваши операторы. Номера обрабатываемых ошибок Nerr1, Nerr2 и т.п. тоже нужно подставить. Показан принцип. Посмотрите.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897849
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) ну конечно она будет светится.
Автор сообщения подразумевал отметить этим выражением, что в этом месте нужно/можно что- либо делать/выполнять - something to do.
Можно было закомментировать конечно строку, вероятно просто забыл...
...
Рейтинг: 0 / 0
Обработка ошибки
    #34897852
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой... опоздал)
Простите.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34898001
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда... Спасибо.
Плохо когда незнал как, и забыл прочитать по ангельски.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub witherr()
    On Error GoTo wrong
    For i =  1  To  10 
        Sheets(i).PivotTables("Turnover").PivotCache.Refresh
        MsgBox ""
    Next i
wrong:
    Select Case Err.Number
    Case  9 
        Resume  'венется на строку ошибки
    Case  1004 
        Resume Next 'венется на строку следующей за ошибкой
    Case Else
        MsgBox Err.Description, , "witherr " & Err.Number
    End Select
End Sub
...
Рейтинг: 0 / 0
Обработка ошибки
    #34898069
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
case 0 - нормальное завершение - забыли.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34905964
vad-anatolij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем кто откликнулся. Особенно vkodor за "FindNext". Как я понял мне можно обойтись без обработки ошибки, но все таки хотел для себя разобраться с сочетанием цикла While-Wend и логикой if.
Например когда я делаю такой макрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub Макрос  333 ()
Rows("1:1").Insert Shift:=xlDown
shir =  1 
sch =  0 
While shir < PravSt
    Set videlen = Range(Cells( 1 , shir), Cells( 20 , shir)).Find(What:="Цех", LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False)
    If Not videlen Is Nothing Then
        sch = sch +  1 
        shir = shir +  1 
Wend
    Else
        MsgBox "Столбец<Цех> не найден"
    End If
        MsgBox sch
End Sub
то Ехель ругается на то, что я использую Wend без While. Т.е. он первую часть цикла не видит. Что я делаю не так.
Спасибо.
...
Рейтинг: 0 / 0
Обработка ошибки
    #34906061
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vad-anatolijто Ехель ругается на то, что я использую Wend без While. Т.е. он первую часть цикла не видит. Что я делаю не так.Нарушаешь принцип структурного программирования. Возьми школьный учебник информатики и прочитай его.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка ошибки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]