如何使用VBA从光标位置到段落开头选择文本

如何使用VBA从光标位置到段落开头选择文本,vba,ms-word,textselection,Vba,Ms Word,Textselection,我正在格式化大型文档中的特定类型的名称。正确的格式为“术语名称(REC)[日期]”,其中除日期外,整个短语均为斜体。我目前正在使用以下代码: Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "(REC)" .Replacement.Text = "*"

我正在格式化大型文档中的特定类型的名称。正确的格式为“术语名称(REC)[日期]”,其中除日期外,整个短语均为斜体。我目前正在使用以下代码:

Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "(REC)"
            .Replacement.Text = "*"
            .Forward = True
            .Wrap = wdFindStop
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Do While Selection.Find.Execute = True
            Selection.MoveRight Unit:=wdCharacter, Count:=1
            Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
            Selection.Font.Italic = wdToggle
            Selection.EndKey Unit:=wdLine, Extend:=wdMove
        Loop
除非斜体短语在两行以上出现中断,否则此操作正常。我得到如下结果: “期限名称
期限(REC)[日期]”
其中第一行没有斜体。VBA是否有办法仅在当前段落开头的光标位置进行选择?

请随时提出更好的方法。

是的,这是可能的。有多种方法可以实现这一点,但一种相当简单的方法是使用
范围
选择
对象的
移动开始
方法

就个人而言,我更喜欢使用
范围
而不是
选择
,因为它更灵活、更快,而且“屏幕闪烁”更少。但下面所示的方法对两者都有效,完全相同

Dim rngFind As Range

Set rngFind = ActiveDocument.Content 'search the document body

rngFind.Find.ClearFormatting
rngFind.Find.Replacement.ClearFormatting
    With rngFind.Find
        .Text = "(REC)"
        .Replacement.Text = "*"
        .Forward = True
        .Wrap = wdFindStop
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Do While rngFind.Find.Execute = True
        rngFind.MoveRight Unit:=wdCharacter, Count:=1
        rngFind.MoveStart Unit:=wdParagraph, Count:=-1
        rngFind.Font.Italic = wdToggle
        rngFind.Collapse wdCollapseEnd
    Loop

是的,有可能。有多种方法可以实现这一点,但一种相当简单的方法是使用
范围
选择
对象的
移动开始
方法

就个人而言,我更喜欢使用
范围
而不是
选择
,因为它更灵活、更快,而且“屏幕闪烁”更少。但下面所示的方法对两者都有效,完全相同

Dim rngFind As Range

Set rngFind = ActiveDocument.Content 'search the document body

rngFind.Find.ClearFormatting
rngFind.Find.Replacement.ClearFormatting
    With rngFind.Find
        .Text = "(REC)"
        .Replacement.Text = "*"
        .Forward = True
        .Wrap = wdFindStop
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Do While rngFind.Find.Execute = True
        rngFind.MoveRight Unit:=wdCharacter, Count:=1
        rngFind.MoveStart Unit:=wdParagraph, Count:=-1
        rngFind.Font.Italic = wdToggle
        rngFind.Collapse wdCollapseEnd
    Loop

这将选择从插入点到段落开头的所有内容。这在文档的开头不起作用,因为之前没有返回:

Selection.MoveStartUntil Cset:=vbCr, Count:=wdBackward

这将选择从插入点到段落开头的所有内容。这在文档的开头不起作用,因为之前没有返回:

Selection.MoveStartUntil Cset:=vbCr, Count:=wdBackward

这是可行的,但是,我的库无法识别rngFind.MoveRight。我将行更改为rngFind.Move Unit:=wdCharacter,Count:=1,它工作正常。而且它的运行速度是我的原始代码的两倍。今天,你教了一个人钓鱼!很高兴你喜欢钓鱼。。。啊,我看到我的错误了:应该是
MoveEnd
(而不是
MoveRight
)。此外,你应该将最能回答你问题的贡献标记为“答案”。您可以更改它。。。稍后,当你在网站上有15个代表点时,你还可以对你认为有帮助的所有贡献(问题和答案)进行投票。这些行动帮助他人并保持网站质量:-)享受,@Thribben!这是可行的,但是,我的库无法识别rngFind.MoveRight。我将行更改为rngFind.Move Unit:=wdCharacter,Count:=1,它工作正常。而且它的运行速度是我的原始代码的两倍。今天,你教了一个人钓鱼!很高兴你喜欢钓鱼。。。啊,我看到我的错误了:应该是
MoveEnd
(而不是
MoveRight
)。此外,你应该将最能回答你问题的贡献标记为“答案”。您可以更改它。。。稍后,当你在网站上有15个代表点时,你还可以对你认为有帮助的所有贡献(问题和答案)进行投票。这些行动帮助他人并保持网站质量:-)享受,@Thribben!