VBA Найти и заменить функцию - где поставить цикл? MS Word - PullRequest
0 голосов
/ 08 июня 2019

Я не могу всю жизнь работать там, где мне нужно поместить цикл в мою функцию поиска и замены.

У меня есть документы с 3+ разрывами строки подряд.Я пишу функцию поиска и замены, которая ищет 3 переноса строк и заменяет их всего 2 переносами строк.Мне нужно циклически повторять это до тех пор, пока не останется только 2 разрывов строки.

См. Ожидаемые и фактические результаты для примера документа.

Я пытался поместить его в "With Selection.Find", но этоне работает?

Private Function FindReplaceLineBreaks()
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "^p^p^p"
        .Replacement.Text = "^p^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Function


Document example:

Chapter 1
Linebreak
Linebreak
Linebreak
Linebreak
Linebreak
This is some text etc. etc.
Linebreak
Linebreak
Linebreak
Linebreak
Linebreak
Linebreak
Linebreak
Linebreak
Linebreak
Text

Expected:

Chapter 1
Linebreak
Linebreak
This is some text etc. etc.
Linebreak
Linebreak
Text

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Попробуйте это:

Private Function FindReplaceLineBreaks()
    with Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "^p^p^p"
        .Replacement.Text = "^p^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False

        Do While .Execute(Replace:=wdReplaceAll)
        Loop

    End With

End Function
0 голосов
/ 09 июня 2019

Самый простой способ сделать это - сделать функцию рекурсивной (функция вызывает себя). Добавьте эту строку в конец вашей функции:

If (Selection.Find.Found = True) then call FindReplaceLineBreaks
...