1

Тема: Обработка ошибок (что-то неверно)

В документе осуществляется проход по закладкам (ранее автоматически установленным) и с ними должно проводиться некие действия. Обработчик ошибок срабатывает только один раз, а при следующей ошибке срабатывать отказывается. Word выдает "Запрашиваемый номер семейства отсутствует"
Вот код. Подскажите, где ошибка?
   

On Error GoTo ErrPerehod
    With ActiveDocument.Bookmarks
        Dim BMItem As String
        For n = 1 To 20
            For i = 1 To 9
                BMItem = "_Capp" & n & "_" & i
                .Item(BMItem).Range.Select
                GoTo PEREHOD
ErrPerehod:
            Next i
PEREHOD:
        Next n
    End With

С уважением

2

Re: Обработка ошибок (что-то неверно)

Существует специальная форма оператора On Error:

On Error Goto 0

Использование данного оператора заставляет VBA удалять любую ловушку ошибки, которая была предварительно установлена с помощью On Error. После удаления ловушки, если произойдет ошибка, то VBA будет выдавать стандартное сообщение об ошибках. Кроме того оператор On Error Goto 0 очищает объект Err, поэтому, если необходимо, нужно сохранять свойства этого объекта...
(данный текст не мой, а из документа, найденного в инете. Ищется по фразе "Обработка ошибок в VBA" или что-то подобное...

3

Re: Обработка ошибок (что-то неверно)

Не понял смысла ответа!!!
Про указанный оператор я знаю, но при чем тут он? Я не собираюсь очищать объект Err. Я не могу понять, почему в моем коде он срабатывает только один раз?

4

Re: Обработка ошибок (что-то неверно)

все просто.. В вашем коде переход осуществляется сразу на метку, минуя цикл..
То есть обработчик ошибок должен быть внутри With

5

Re: Обработка ошибок (что-то неверно)

Если бы было так все просто, то должен был бы работать следующий код:

Dim BMItem As String
        For n = 1 To 20
            For i = 1 To 9
                On Error GoTo ErrPerehod
                ActiveDocument.Bookmarks.Item(BMItem).Range.Select
                GoTo PEREHOD
ErrProhod:
                Err.Clear
            Next i
PEREHOD:
        Next n

а он работает абсолютно так же

6

Re: Обработка ошибок (что-то неверно)

Сейчас, к сожалению, нет времени полностью проанализировать код. Но я бы постарался сделать без использования меток и переходов к ним... Хотя, в готовых решениях по сосданию списка сокращений у меня есть функция обработки ошибок и все работает нормально.. Можете там посмотреть реализацию..

7

Re: Обработка ошибок (что-то неверно)

Код "On Error GoTo <метка>" активирует обработчик ошибок пользователя, а не просто переходит по метке. Пока выполняется обработка ошибки пользователем, другие ошибки не обрабатываются (поэтому срабатывает один раз). Для завершения обработки ошибки служит команда Resume, также обработчик останавливают Exit Sub, Exit Function, Exit Property. Правильной будет конструкция:

    On Error GoTo ErrorHandler
    . . .
    Exit Sub
ErrorHandler:
    . . .
    Resume Next

Вы не собираетесь ничего обрабатывать, а просто отслеживаете ошибку. Вам подойдет конструкция:

    On Error Resume Next
    ...
    If Err.Number <> 0 Then GoTo <метка>

Отредактировано Вождь (21.10.2010 01:27:44)

Макросы под заказ и готовый пакет - mtdmacro.ru

8

Re: Обработка ошибок (что-то неверно)

Вождь, при использовании конструкции Resume Next выполнение кода переходит на строку после строки с ошибкой. Потому, в моем случае приходится делать два перехода. Получилось вот так:

Dim BMItem As String
        For n = 1 To 20
            For i = 1 To 9
                On Error GoTo ErrPerehod
                ActiveDocument.Bookmarks.Item(BMItem).Range.Select
                GoTo PEREHOD
ErrPerehod:
                Resume ErrPerehod2
ErrPerehod2:
            Next i
PEREHOD:
        Next n

В любом случае спасибо за подсказку

9

Re: Обработка ошибок (что-то неверно)

А у меня получилось так:

    With ActiveDocument.Bookmarks
        Dim BMItem As String
        For N = 1 To 20
            For i = 1 To 9
                BMItem = "_Capp" & N & "_" & i
                On Error Resume Next
                .Item(BMItem).Range.Select
                If Err.Number = 0 Then Exit For
            Next i
        Next N
    End With

Что получилось сказать не могу smile но делает тоже.

Отредактировано Вождь (21.10.2010 08:43:21)

Макросы под заказ и готовый пакет - mtdmacro.ru

10

Re: Обработка ошибок (что-то неверно)

Да, точно, правильно! Совсем забыл, что Err.Number = 0 означает, что нет ошибки!
Отлично. Большое спасибо!