Массив диапазонов хранит тот же диапазон.Зачем? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть следующий код в Word:

Function findRanges(keyword) As Variant()
    Dim foundRanges(), rngSearch As Range
    Dim i, foundCount As Integer

    i = 0
    foundCount = 0

    Set rngSearch = ActiveDocument.Range
    With rngSearch.Find
        Do While .Execute(FindText:=keyword, MatchWholeWord:=True, Forward:=True) = True
            foundCount = foundCount + 1
            rngSearch.Collapse Direction:=wdCollapseEnd
        Loop
    End With

    ReDim foundRanges(0 To foundCount - 1)

    Set rngSearch = ActiveDocument.Range
    With rngSearch.Find
        Do While .Execute(FindText:=keyword, MatchWholeWord:=True, Forward:=True) = True
            Set foundRanges(i) = rngSearch
            MsgBox "rngSearch / " & rngSearch.End
            MsgBox "foundRanges / " & foundRanges(i).End
            i = i + 1
            rngSearch.Collapse Direction:=wdCollapseEnd
        Loop
    End With

    For j = LBound(foundRanges) To UBound(foundRanges)
        MsgBox j & "foundRanges / " & foundRanges(j).End
    Next j

    findRanges = foundRanges
End Function

Когда я использую эту функцию, диапазоны, хранящиеся в массиве "foundRanges", различаются (я проверяю их по конечной позиции).НО, как только мой цикл поиска заканчивается, диапазоны становятся одинаковыми (они имеют одинаковую конечную позицию), и я не могу понять, почему.

Я хочу сохранить местоположения каждого найденного ключевого слова вмассив и изменить ключевые слова позже для пользовательского ввода.

1 Ответ

0 голосов
/ 18 декабря 2018

Вам необходимо продублировать диапазон перед его сохранением - в противном случае вы сохраняете ссылку на тот же диапазон, и этот диапазон постоянно меняется при повторном вызове .Find().

Что-токак это:

Function findRanges(keyword, Optional SearchIn As Range) As Variant()
    Dim foundRanges(), i As Integer

    If SearchIn Is Nothing Then Set SearchIn = ActiveDocument.Range

    Do While SearchIn.Find.Execute(FindText:=keyword, MatchWholeWord:=True, Forward:=True)
        ReDim Preserve foundRanges(i)
        Set foundRanges(i) = SearchIn.Duplicate
        SearchIn.Collapse Direction:=wdCollapseEnd
        i = i + 1
    Loop

    findRanges = foundRanges
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...