Для меня работает следующее.
В этом коде каждой переменной объекта явно присваивается тип.В VBA каждая переменная должна быть набрана, в противном случае ей присваивается тип Variant
по умолчанию.Например, в следующей строке объявления foundRanges()
имеет тип Variant
, поскольку за ним не следует As
с типом данных.То же самое с i
в следующей строке кода в вопросе.
Dim foundRanges(), rngSearch As Range
И поскольку массивы в вызывающей процедуре имеют тип Range
, функция должна возвращать тот же тип.
Я также взял на себя смелость передать объект Document
в функцию, поскольку, возможно, однажды рассматриваемый документ может быть не ActiveDocument
, а объектом Document
, назначенным с использованием Documents.Open
или Documents.Add
.Если это нежелательно, его можно изменить обратно, но не полагаться на ActiveDocument
более надежно ...
Кроме того, я добавил параметр Wrap
в Find.Execute
- это всегда хорошая идея дляукажите это при выполнении поиска в цикле, чтобы предотвратить повторный поиск в начале документа (wdFindContinue).
Sub testRangesInArrays()
Dim rngIAM_Code() As Range
Dim rngIAM_Title() As Range
rngIAM_Code = findRanges("You", ActiveDocument)
rngIAM_Title = findRanges("change", ActiveDocument)
End Sub
Function findRanges(keyword As String, doc As Word.Document) As Range()
Dim foundRanges() As Range, rngSearch As Range
Dim i As Integer, foundCount As Integer
i = 0
foundCount = 0
ReDim foundRanges(0)
Set rngSearch = doc.content
Do While rngSearch.Find.Execute(findText:=keyword, MatchWholeWord:=True, _
Forward:=True, wrap:=wdFindStop) = True
Set foundRanges(i) = rngSearch.Duplicate
ReDim Preserve foundRanges(UBound(foundRanges) + 1)
i = i + 1
rngSearch.Collapse Direction:=wdCollapseEnd
Loop
findRanges = foundRanges
End Function