Как я могу найти несколько вхождений текста внутри выделения (Word VBA) - PullRequest
0 голосов
/ 26 декабря 2018

Мне нужно изменить нумерацию нескольких сотен приложений к документу.И нумерация должна иметь разные префиксы.Поэтому я хочу выбрать часть документа и запустить макрос для выбора.Но я могу использовать Find.Execute только для всего документа, а не для выделения.Как должен выглядеть код для моей задачи?

Когда я выбираю часть документа и запускаю макрос, выделение сворачивается и выполнение кода продолжается до конца документа, а не до конца выделения.Я пытался сохранить конечную позицию выделения, но это дает бесконечный цикл.

Мой код

Set rngSearch = Selection.Range

    Do While rngSearch.Find.Execute(FindText:="App.№", MatchWholeWord:=True, Forward:=True) = True
        'routine to change numbering (replace text) and increment counter
        rngSearch.Collapse Direction:=wdCollapseEnd

    Loop

Я также пытался перебрать абзацы документа, но это было слишком медленно (несколькоминут без результата).

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Синди Мейстер.Думаю, я не совсем понял ваше предложение, потому что оно ведет к бесконечному циклу, меняющему один и тот же регион снова и снова.Но я попробовал другой способ: я удалил строку «rngSearch.Collapse Direction: = wdCollapseEnd» и использовал следующий код:

Set originalRange = Selection.Range
endPos = originalRange.End

Set rngSearch = originalRange.Duplicate
With rngSearch.Find
    Do While .Execute(FindText:=keyword, MatchWholeWord:=True, Forward:=True) = True
        With rngSearch
        rngSearch.Select
        startPos = rngSearch.End

        'routine to change numbers and increment counter

        rngSearch.Select
        rngSearch.Start = startPos
        rngSearch.End = endPos
        End With
    Loop
End With

Этот код работает хорошо.Не могли бы вы прокомментировать, если все в порядке?

0 голосов
/ 26 декабря 2018

Подход, который я использую, заключается в работе с двумя Range объектами: один для выделенного текста, другой для фактического поиска.Для каждого прохода в цикле после свертывания диапазона поиска устанавливается конечная точка диапазона выбора.

Чтобы сделать «копии» Range, используйте свойство Duplicate.

Sub FindOnlyInSelection()
    Dim rngSel As Word.Range
    Dim rngSearch As Word.Range

    Set rngSel = Selection.Range
    Set rngSearch = rngSel.Duplicate

    Do While rngSearch.Find.Execute(findText:="App.?", MatchWholeWord:=True, Forward:=True) = True
        'routine to change numbering (replace text) and increment counter
        rngSearch.Collapse Direction:=wdCollapseEnd
        rngSearch.End = rngSel.End
    Loop
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...