首页 > 解决方案 > 如何在段落中搜索多个字符串(列表中的任何一个字符串)(使用输入和输出图像更新)

问题描述

我的目标是根据预定义的字符串(在一个数组中)合并多个段落,例如句点 (.) 或问号 (?)

我的例句如下(请参考图片):

输入

预期的结果将是这样的。

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

输出

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

在下面的代码中,我可以使用句点 (.) 来实现它,但是对于每个其他结束字符串,我都有单独的宏。取决于结束字符串,我运行不同的宏。有没有办法将所有这些搜索字符串 (. / ? / ;) 放在一个数组中,并要求代码运行,直到找到它们中的任何一个并退出循环并进行合并?

块引用

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

//////////////////////////// 子 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

块引用

有人可以帮我吗,拜托!

标签: vbams-word

解决方案


正如我在评论中指出的那样,段落不一定以标点符号结尾。也就是说,实现您所描述的结果的粗略但有效的解决方案是使用通配符查找/替换,其中:

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

IOW,您甚至不需要宏。由于我们不知道源文本中的段落分隔符之前是否有空格,因此您最终可能会得到一些额外的空格 - 您可以使用另一个 Find/Replace 来清理这些空格(或者您可以从 Replace 表达式中省略 ^32 )。


推荐阅读