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)
以下代码将执行您想要的操作.但是,我以这样的方式编写它,我认为这将使您最好地理解它.
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并且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"之前开始2个单词,并以"Michael"结尾.您可以复制此范围或将其删除,或根据需要进行修改.请记住,您的屏幕仍然显示原始屏幕Selection.Range.MS Word不允许您分配Set Selection.Range = Rng,但有一种更简单的方法可以使用代码完成的内容重新对齐显示.通过.Select在修改Font之后添加该行(在外部之前End With),修改后的内容Rng将成为Selection.