Word 2016 VBA: не удается найти EndOfDoc, когда курсор находится в сноске

Я сделал макрос поиска и замены, который зацикливается на конце документа, вот так:

Sub CheckEnglishAndTypos()
    Do Until ActiveDocument.Bookmarks("\Sel").Range.End = ActiveDocument.Bookmarks("\EndOfDoc").Range.End
    'Loop the search till the end
        Selection.MoveDown Unit:=wdLine, Count:=1
        Selection.Paragraphs(1).Range.Select
        With Selection.Find
            .Text = "(<*>) \1"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindStop
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = True
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
            Selection.Find.Execute Replace:=wdReplaceAll
        Loop
        ' Searching the remaning (till the end of document)
        Exit Sub
End Sub

Проблема в том, что если в документе есть сноска, а поиск переместился в сноску, он выдаст ошибку "Запрошенный член коллекции не существует". По-видимому, макрос не может найти конец документа, если выделение / курсор находятся внутри сноски, а в документе есть страницы, следующие за страницей сноски.

Есть ли способ это исправить? Было бы здорово исключить сноски из поиска, но я открыт для любых других альтернативных решений.

2 ответа

Решение

Строка поиска является проблемой

Sub CheckEnglishAndTypos()

    Options.DefaultHighlightColorIndex = wdBlue
'   Options.DefaultHighlightColorIndex = wdYellow

    With ActiveDocument.Content.Find
        .ClearFormatting
'       .Text = "(<*>) \1"                ' really slow
        .Text = " ([A-Za-z]@) \1"
        .Replacement.Text = ""
        .Replacement.ClearFormatting
        .Replacement.Highlight = True
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With
End Sub

Попробуйте это, он должен сделать весь документ

Sub CheckEnglishAndTypos()

    Options.DefaultHighlightColorIndex = wdBlue
'   Options.DefaultHighlightColorIndex = wdYellow

    With ActiveDocument.Content.Find
        .ClearFormatting
        .Text = "(<*>) \1"
        .Replacement.Text = ""
        .Replacement.ClearFormatting
        .Replacement.Highlight = True
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With
End Sub
Другие вопросы по тегам