Word VBA 查找并继续

Word VBA Find and move on

这是我的问题, 我正在寻找 ":" 并使用 VBA 键入 HTML 代码。下面的代码在相同的 ":" 处循环,并且不会转到下一个,因为我实际上并没有删除它。有什么建议吗?

Dim bFound As Boolean


bFound = True
Set r = ActiveDocument.Content

r.Find.ClearFormatting
Do While bFound
    With r.Find
        .Text = ":"
        .Replacement.Text = ":</b>"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        bFound = .Execute(Replace:=wdReplaceOne, Forward:=True)
    End With

    If bFound Then
        r.Select
        Selection.HomeKey Unit:=wdLine
        Selection.TypeText Text:="<b>"
        Selection.EndKey Unit:=wdLine
        Selection.MoveRight
    End If
Loop

代码有两个问题,其他方面还不错:

  1. Wrap属性使用wdFindContinue,表示Find会从文件开头重新开始。根据经验,请始终在代码中使用 wdFindStop

  2. 如果要搜索的内容仍在文档中,则有必要将找到的范围移到该点之外。这可以通过使用 Range.Collapse 来完成。可以把它想象成在有选择时按键盘上的右箭头键:它会将光标放在所选内容之外。

我已经用这两个更改修改了原始代码,另外我还声明了一个 Range 变量。没有此声明的原始代码 运行 表示 Option Explicit 可能不在代码模块的顶部。如果有就更好了...

Sub JumpBeyondFound()
    Dim r As Word.Range
    Dim bFound As Boolean

    bFound = True
    Set r = ActiveDocument.content

    r.Find.ClearFormatting
    Do While bFound
        With r.Find
            .Text = ":"
            .Replacement.Text = ":</b>"
            .Forward = True
            .wrap = wdFindStop
            .Format = False
            .MatchCase = True
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            bFound = .Execute(Replace:=wdReplaceOne, Forward:=True)
        End With

        If bFound Then
            r.Select
            Selection.HomeKey Unit:=wdLine
            Selection.TypeText Text:="<b>"
            Selection.EndKey Unit:=wdLine
            Selection.MoveRight
            r.Collapse wdCollapseEnd
        End If
    Loop
End Sub