从编号列表上项目符号的最后一行删除段落标记,而不破坏最后一个项目符号/编号

时间:2019-05-22 17:17:29

标签: vba ms-word

我在Word中有一个编号列表,每次输入后都有一个段落标记。最后,在段落标记之后,有一个引号。我想从编号列表中删除最后一个段落标记,以便将引号放在编号列表的最后一行旁边。但是,对"^p" & ChrW(8220)使用“查找并替换”会删除该段落,但也会删除最后一个条目的编号。

我设法通过选择引号,左移一个字符然后删除一个字符来解决问题。但是,它是不一致的,我不相信它是可靠的。

  Selection.Find.ClearFormatting
    With Selection.Find
        .Text = ChrW(8220)
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.TypeBackspace

enter image description here

是否有另一种方法可以将引号放在最后一个条目的旁边而不破坏编号?

2 个答案:

答案 0 :(得分:1)

可以通过多种方式完成此操作;使用哪种方法主要取决于个人喜好。这是两个。一个使用通配符查找替换。另一个操作Range对象。第一个执行速度可能更快(尽管在这种情况下不会很明显),并且在Word的“撤消”列表中仅留下一个“足迹”。

注意:我更喜欢使用Range而不是Selection。第一个选项可以用Selection完成;第二种方法是使用Range更好。

  1. 对段落标记和引号进行通配符搜索。请注意,每个术语都在括号内:可以在替换中使用该术语-括号定义表达式

这使得反向替换信息成为可能:引号位于段落标记之前-段落标记保持完整(子弹未丢失)。

Sub TestFindParaAndQuote()
    Dim rngFind As Word.Range

    Set rngFind = ActiveDocument.content
    rngFind.Find.ClearFormatting
    With rngFind.Find
        .Text = "(^13)(" & ChrW(8220) & ")"
        .Replacement.Text = "\2\1"
        .Forward = True
        .wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = True
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute Replace:=wdReplaceOne
    End With

End Sub
  1. Find.Execute成功时,Range(或Selection)将移至找到的项。在这里,如果bFound = True,则:1)将引号插入Range之前; 2)Range折叠到其端点(在原始引号之后); 3)然后向后扩展以包括该报价; 4),并删除整个Range。 (如果还应删除原始引号后面的段落,则可以包括注释掉的以下行。)

当标准的“查找/替换”由于某种原因而无法执行此工作时,该示例有助于理解如何使用Find

Sub TestFindParaAndQuote()
    Dim rngFind As Word.Range
    Dim bFound As Boolean

    Set rngFind = ActiveDocument.content
    rngFind.Find.ClearFormatting
    With rngFind.Find
        .Text = "^p" & ChrW(8220)
        .Forward = True
        .wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        bFound = .Execute
        If bFound Then
            rngFind.InsertBefore ChrW(8220)
            rngFind.Collapse wdCollapseEnd
            rngFind.MoveStart wdCharacter, -1
            'rngFind.MoveEnd wdCharacter, 1 'use this, too, if the paragraph mark should be removed
            'rngFind.Select                 'for testing purposes
            rngFind.Delete
        End If
    End With

End Sub

答案 1 :(得分:0)

如果您在右引号之前删除段落标记,则列表的最后一个段落将继承其后一段的格式。

如果列表已使用数字样式设置格式,则可以将该样式应用于包含引号的段落,然后再删除前面的段落标记。

如果不是这样,对您来说将更加困难。您可以尝试在列表的最后一个段落中添加引号,然后删除最后一个段落,但是如果它是文档中的最后一个段落,则可能不起作用。