VBA Word:我想找一个短语,选择它前面的单词,然后用文本表示

Kev*_*vin 2 vba ms-word word-vba

我在使用VBA命令找到某个短语时遇到问题,然后在它之前选择1或2个单词,然后将整个事物用斜体表示.

我能使用Selection.Find,Font.Italicise以及wdExtend相互独立的命令,但是当我将它们合并执行此任务,宏只是崩溃.有帮助吗?

Selection.Find.ClearFormatting
 With Selection.Find
     .Text = "Michael"
     .Replacement.Text = "Michael"
     .Forward = True
     .Wrap = wdFindStop
     Do While .Execute() = True
         Selection.TypeParagraph
         Selection.MoveLeft Unit:=wdWord, Count:=2, Extend:=wdExtend
         Selection.Find.Replacement.Font.Italic = True
         Selection.Font.Bold = True
         Selection.Collapse Direction:=wdCollapseEnd
     Loop
 End With
Run Code Online (Sandbox Code Playgroud)

Var*_*tus 8

以下代码将执行您想要的操作.但是,我以这样的方式编写它,我认为这将使您最好地理解它.

Private Sub SelFind()
    ' 08 Apr 2017

    Dim Rng As Range
    Dim Fnd As Boolean

    Set Rng = Selection.Range
    With Rng.Find
        .ClearFormatting
        .Execute FindText:="Michael", Forward:=True, _
                 Format:=False, Wrap:=wdFindStop
        Fnd = .Found
    End With

    If Fnd = True Then
        With Rng
            .MoveStart wdWord, -2
            With .Font
                .Italic = True
                .Bold = True
            End With
        End With
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

首先想象你的文档中的所有字符串成一行,穿插格式代码,这些代码也被视为字符.这段长字符在代码中称为范围ActiveDocument.Range.

您可以选择文档整个范围的任何部分.那Selection.Range就像所有范围一样,它有一个Start(第一个字节)和一个End(最后一个字节.Start并且EndRange数字表示的属性,从第一个字节开始计算.我的代码创建一个新的Range对象,它是所谓的RNG该Selection.Range被分配给新的对象.RngSelection.Range是相同的这一点,但是当你操纵Rng的对象,则Selection.Range不会改变.

代码现在在Rng对象中查找"Michael" .您设置搜索的语法非常完美.我使用了不同的语法,因为我发现它更容易掌握..Found如果搜索成功,则该属性返回True.在这种情况下,搜索范围被改变为仅包括找到的子范围.如果在搜索中进行搜索,Selection.Range您会看到屏幕上突出显示"Michael".但由于搜索是在内存中(在Rng对象上)进行的,因此Selection.Range保持不变,而Rng对象现在只包含单词"Michael".

所以,回到ActiveDocument.Range其中Rng的一部分,我们现在将Start属性向左移动两个单词.正数将向右移动2个字.没有必要,Extend因为命令非常清楚:"Move Start",意味着End保持原样.

现在,Rng对象在"Michael"之前开始2个单词,并以"Michael"结尾.您可以复制此范围或将其删除,或根据需要进行修改.请记住,您的屏幕仍然显示原始屏幕Selection.Range.MS Word不允许您分配Set Selection.Range = Rng,但有一种更简单的方法可以使用代码完成的内容重新对齐显示.通过.Select在修改Font之后添加该行(在外部之前End With),修改后的内容Rng将成为Selection.

  • 非常感谢,这是非常有帮助和教育意义的。 (2认同)