Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка ошибки / 24 сообщений из 24, страница 1 из 1
23.10.2007, 22:45:43
    #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
23.10.2007, 23:33:30
    #34889534
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
....оооо чорт! У меня сегодня абсолютно такой же вопрос возник!!! - маялся полдня, в итоге обошелся конструкцией Resume Next. Помогло, но этот вопрос оставил осадок на душе моей.
Люди добрые, расскажите нам про обработку ошибок в цикле!
...
Рейтинг: 0 / 0
24.10.2007, 10:41:47
    #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
24.10.2007, 10:57:10
    #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
24.10.2007, 11:41:05
    #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
24.10.2007, 16:47:00
    #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
25.10.2007, 09:03:36
    #34893202
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
lena_###, спасибо!
Однако, это не совсем то. Хотелось бы понять - почему в моем примере при втором проходе в цикле не срабатывает On Error GoTo ErrorData.
...
Рейтинг: 0 / 0
25.10.2007, 12:02:37
    #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
25.10.2007, 17:49:10
    #34895282
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
LETMElena_###, спасибо!
Однако, это не совсем то. Хотелось бы понять - почему в моем примере при втором проходе в цикле не срабатывает On Error GoTo ErrorData.Потому что обработка ошибки не рекурсивна. Ошибка случившаяся в обработчике ошибки не перехватывается.
...
Рейтинг: 0 / 0
25.10.2007, 17:51:57
    #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
26.10.2007, 13:28:24
    #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
26.10.2007, 13:30:55
    #34897265
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
хммм... а это действительно рабочий вариант!
vkodor, спасибо!
...
Рейтинг: 0 / 0
26.10.2007, 13:43:21
    #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
26.10.2007, 13:58:17
    #34897397
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
To LeonM
можно пояснить
To Do - это что?
Вы уверены что это VBA?
...
Рейтинг: 0 / 0
26.10.2007, 14:05:46
    #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
26.10.2007, 14:57:34
    #34897652
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
vkodorTo LeonM
можно пояснить
To Do - это что?
Вы уверены что это VBA?

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

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

)) vkodor, Вы это серьезно спрашивате???
Вообще-то да.
Открыл Excel
открыл VBA
скопировал код
строка
Код: plaintext
        something to do
светится
открыл ворд ... тоже самое
открыл Access, PowerPoint тоже самое
дальше проверять не стал
На этом месте должны стоять Ваши операторы. Номера обрабатываемых ошибок Nerr1, Nerr2 и т.п. тоже нужно подставить. Показан принцип. Посмотрите.
...
Рейтинг: 0 / 0
26.10.2007, 15:37:24
    #34897849
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
:) ну конечно она будет светится.
Автор сообщения подразумевал отметить этим выражением, что в этом месте нужно/можно что- либо делать/выполнять - something to do.
Можно было закомментировать конечно строку, вероятно просто забыл...
...
Рейтинг: 0 / 0
26.10.2007, 15:37:47
    #34897852
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
Ой... опоздал)
Простите.
...
Рейтинг: 0 / 0
26.10.2007, 16:12:23
    #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
26.10.2007, 16:27:22
    #34898069
LeonM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
case 0 - нормальное завершение - забыли.
...
Рейтинг: 0 / 0
30.10.2007, 21:58:00
    #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
30.10.2007, 23:48:01
    #34906061
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка ошибки
vad-anatolijто Ехель ругается на то, что я использую Wend без While. Т.е. он первую часть цикла не видит. Что я делаю не так.Нарушаешь принцип структурного программирования. Возьми школьный учебник информатики и прочитай его.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка ошибки / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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