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