как искать несколько строк (любой из строк в списке) в абзаце (обновляется с помощью входных и выходных изображений) - PullRequest
0 голосов
/ 27 марта 2019

Моя цель - объединить несколько абзацев на основе предопределенной строки (в произвольной форме), такой как точка (.) Или вопросительный знак (?)

Мое предложение приведено ниже (см. Изображение, пожалуйста):

Input

Ожидаемый результат будет примерно таким.

/////////////////////////////////////////////// /////////

выход

/////////////////////////////////////////////// /////////

В приведенном ниже коде я мог бы добиться этого, используя точку (.), Но для каждой другой конечной строки у меня есть отдельный макрос. Зависит от конца строки, я запускаю разные макросы. Есть ли способ поместить все эти строки поиска (. /? /;) В один массив и попросить код работать до тех пор, пока он не найдет ни одну из них и не выйдет из цикла и не выполнит слияние?

Blockquote

Sub FindDotToJoinParagraph()
Dim xRange As Range
Dim Srt As Variant
Dim Endee As Variant
Dim currentPosition As Range



Selection.HomeKey Unit:=wdLine, Extend:=wdMove  
ActiveDocument.Bookmarks.Add Range:=Selection.Range, Name:="Srt" 'Bookmark

With Selection.Find
    .Text = "." 'Here not just period alone, but others too 
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With

Selection.Find.Execute
Selection.EndKey Unit:=wdLine, Extend:=wdMove
ActiveDocument.Bookmarks.Add Range:=Selection.Range, Name:="Ends" 'Bookmark

ActiveDocument.Range( _
    ActiveDocument.Bookmarks("Srt").Range.Start, _
    ActiveDocument.Bookmarks("Ends").Range.Start) _
    .Select

call MergeParaAndLineBreaks() 'An another sub-routine to merge 

End Sub

////////////////////////////////// Sub MergeParaAndLineBreaks ()

Dim oRng As Range
Set oRng = Selection.Range

Dim oFind As Range
Set oFind = Selection.Range

With oFind.Find
    Do While .Execute(findtext:="[^13^l]{1,}", MatchWildcards:=True)
        If oFind.InRange(oRng) Then
            oFind.Text = ""
        End If
    Loop
End With
Set oFind = oRng

With oFind.Find
    Do While .Execute(findtext:="[ ]{2,}", MatchWildcards:=True)
        If oFind.InRange(oRng) Then
            oFind.Text = Chr(32)
            oFind.Collapse 0
        End If
    Loop
End With

lbl_Exit:
Set oRng = Nothing
Set oFind = Nothing
Exit Sub
End Sub

Blockquote

Может кто-нибудь помочь мне, пожалуйста!

1 Ответ

0 голосов
/ 28 марта 2019

Как отмечено в моих комментариях, абзацы не обязательно заканчиваются знаками препинания. Тем не менее, грубое, но эффективное решение для достижения результатов, которые вы описали, будет использовать подстановочный знак Найти / Заменить, где:

Find = ([!.\!\?;:])^13
Replace = ^32\1

Итак, вам даже не нужен макрос. Поскольку мы не знаем, есть ли пробелы, предшествующие разрывам абзаца в исходном тексте, у вас могут возникнуть дополнительные пробелы, которые вы могли бы очистить с помощью другого поиска / замены (или вы можете опустить ^ 32 в выражении замены) ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...