我在使用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
最佳答案
以下代码将执行您想要的操作。但是,我以我认为可以使您最好地理解它的方式编写它。
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
是用数字表示的Range
的属性,从第一个字节开始计数。我的代码创建了一个新的Range对象(称为Rng。Selection.Range)已分配给该新对象,此时Rng
和Selection.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”开头两个单词,以“Michael”结尾。您可以复制或删除此范围,或根据需要对其进行修改。请记住,您的屏幕仍然显示原始的
Selection.Range
。 MS Word不允许您分配Set Selection.Range = Rng
,但是有一种甚至更简单的方法来将显示与代码所做的操作重新对齐。通过在修改Font之后(在外部.Select
之前)添加End With
行,修改后的Rng
将成为Selection。
关于vba - VBA单词: I would like to find a phrase,选择其前面的单词,并以斜体显示文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43284752/