如何在一个选择中找到一个文本的多次出现(Word VBA)

时间:2018-12-26 07:27:12

标签: vba ms-word

我需要更改文档的数百个附录的编号。并且编号应具有不同的前缀。因此,我想选择文档的一部分并为选择运行一个宏。但是我只能将Find.Execute用于整个文档,而不能用于选择。代码应如何查找我的任务?

当我选择文档的一部分并运行宏时,选择会折叠并且代码执行将继续到文档末尾而不是选择的末尾。我试图存储选择的“结束”位置,但它给出了无限循环。

我的代码

Set rngSearch = Selection.Range

    Do While rngSearch.Find.Execute(FindText:="App.№", MatchWholeWord:=True, Forward:=True) = True
        'routine to change numbering (replace text) and increment counter
        rngSearch.Collapse Direction:=wdCollapseEnd

    Loop

我也尝试遍历文档段落,但是太慢了(几分钟没有结果)。

2 个答案:

答案 0 :(得分:1)

我使用的方法是使用两个 Range对象:一个用于所选文本,一个用于实际搜索。对于每次循环,折叠搜索范围后,将其设置为选择范围的终点。

为了制作Range的“副本”,请使用Duplicate属性。

Sub FindOnlyInSelection()
    Dim rngSel As Word.Range
    Dim rngSearch As Word.Range

    Set rngSel = Selection.Range
    Set rngSearch = rngSel.Duplicate

    Do While rngSearch.Find.Execute(findText:="App.?", MatchWholeWord:=True, Forward:=True) = True
        'routine to change numbering (replace text) and increment counter
        rngSearch.Collapse Direction:=wdCollapseEnd
        rngSearch.End = rngSel.End
    Loop
End Sub

答案 1 :(得分:0)

辛迪·梅斯特。我想我不太了解您的建议,因为它会导致无限循环反复更改同一区域。但是我尝试了另一种方法:删除了“ rngSearch.Collapse Direction:= wdCollapseEnd”行,并使用了下一个代码:

Set originalRange = Selection.Range
endPos = originalRange.End

Set rngSearch = originalRange.Duplicate
With rngSearch.Find
    Do While .Execute(FindText:=keyword, MatchWholeWord:=True, Forward:=True) = True
        With rngSearch
        rngSearch.Select
        startPos = rngSearch.End

        'routine to change numbers and increment counter

        rngSearch.Select
        rngSearch.Start = startPos
        rngSearch.End = endPos
        End With
    Loop
End With

此代码运行良好。可以吗?