Word 2010 VBA在突出显示的范围内替换

时间:2013-01-25 04:36:17

标签: word-vba

以下代码有效,但它会执行整个文档上的所有内容。我想突出显示一个文本块,然后当我运行宏让它在突出显示的文本上工作。我怎么做?感谢...

Sub DoCodeNumberStyle(numchars As String)

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(^13)([0-9]{" + numchars + "}) "
        .Replacement.Text = "\1###\2$$$ "
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles("CodeNumber")
    With Selection.Find
        .Text = "###([0-9]{" + numchars + "})$$$"
        .Replacement.Text = "\1"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Sub CodeNumberStyle()
    DoCodeNumberStyle ("1")
    DoCodeNumberStyle ("2")
End Sub

后记:

我发现了另外一件事:如果你在一个选择上做多个查找,第一个找到丢失/更改选择,所以其他人不再受原始选择的限制(并且wdReplaceAll将继续到文件结尾)。要解决此问题,请将选择捕获到范围中。这是我的方法的最终版本,现在我需要的一切,仅限于原始突出显示的选择(即使有3个查找和替换),并且已经最小化,代码方式:

Sub AAACodeNumberStyleHighlightedSelection()

    With Selection.Range.Find
        .ClearFormatting
        .Style = ActiveDocument.Styles("Code")
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False

        ' First line:
        .Text = "1   //"
        .Replacement.Text = "###1$$$   //"
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll

        ' Rest of lines:
        .Text = "(^13)([0-9]{1,2}) "
        .Replacement.Text = "\1###\2$$$ "
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll

        ' Now style the line numbers:
        .Text = "###([0-9]{1,2})$$$"
        .Replacement.Text = "\1"
        .Replacement.Style = ActiveDocument.Styles("CodeNumber")
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll

    End With

End Sub

3 个答案:

答案 0 :(得分:2)

将.Wrap更改为wdFindStop,这应该对你有用。我认为这可能是一个轻微的Word bug;文档说Wrap值

  

设置如果搜索从文档开头以外的点开始并且到达文档末尾会发生什么(或者如果Forward设置为False则反之亦然)或者如果搜索文本未在指定的选择或范围。

但它似乎迫使Find去文档的末尾,而不是考虑选择。无论如何,如果你只计划在选择上运行它,则不需要wdFindAsk。

答案 1 :(得分:0)

我也发现,即使在一个范围上开始一个FIND循环,该范围也会被FIND重新定义,因此.execute上的连续循环超出原始范围到文档末尾。 wdFindStop仅在文档末尾停止,而不是在原始范围的末尾停止。

所以,我插入了一个IF语句:

同时执行.find.found   ...   如果.find.parent.InRange(doc.Bookmarks(“BODY”)。Range)= False然后退出Do   ...   。执行 环

答案 2 :(得分:0)

Set myRange = Selection.Range
 myRange.Select
    With Selection.Find
        .Text = "Apple"
        .Replacement.Text = "Banana"
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        '.MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

   myRange.Select
        With Selection.Find
        .Text = "red"
        .Replacement.Text = "yellow"
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        '.MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll