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