我在使用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
答案 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(最后一个字节。Start
和End
是{{1}的属性数字表示,从第一个字节开始计算。我的代码创建一个名为Rng的新Range对象.Relection.Range被分配给该新对象。Range
和Rng
在这一点上是相同的,但在操纵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
将成为选择。