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

时间:2017-04-07 18:21:49

标签: vba ms-word word-vba

我在使用VBA命令查找某个短语时遇到问题,然后在它之前选择1或2个单词,然后将整个单词设置为斜体。

我可以相互独立地使用Selection.FindFont.ItalicisewdExtend命令,但是当我将它们组合起来执行此任务时,宏只会崩溃。有什么帮助吗?

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

1 个答案:

答案 0 :(得分:5)

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

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

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

您可以选择文档整个范围的任何部分。这将是Selection.Range,它与所有范围一样,具有Start(第一个字节)和End(最后一个字节。StartEnd是{{1}的属性数字表示,从第一个字节开始计算。我的代码创建一个名为Rng的新Range对象.Relection.Range被分配给该新对象。RangeRng在这一点上是相同的,但在操纵Selection.Range对象时,Rng不会改变。

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

因此,回到Rng,其中ActiveDocument.Range是其中的一部分,我们现在将Rng属性向左移动两个单词。正数将向右移动2个字。不需要Start,因为命令非常清楚:“Move Start”,意味着End保持原样。

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