【发布时间】:2019-05-19 17:37:59
【问题描述】:
我有下一个代码:
Function findRanges(keyword) As Variant()
Dim foundRanges(), rngSearch As Range
Dim i, foundCount As Integer
i = 0
foundCount = 0
ReDim foundRanges(0)
Set rngSearch = ActiveDocument.Range
Do While rngSearch.Find.Execute(FindText:=keyword, MatchWholeWord:=True, Forward:=True) = True
Set foundRanges(i) = rngSearch.Duplicate
i = i + 1
ReDim Preserve foundRanges(UBound(foundRanges) + 1)
rngSearch.Collapse Direction:=wdCollapseEnd
Loop
ReDim Preserve foundRanges(UBound(foundRanges) - 1)
findRanges = foundRanges
End Function
还有:
Sub test()
Dim rngIAM_Code() As Range
...
Dim rngIAM_Title() As Range
rngIAM_Code = findRanges("IAM_Code")
...
rngIAM_Title = findRanges("IAM_Title")
End Sub
非常令人困惑的是,有时编译器会说“无法分配给数组”,有时它工作正常。例如,当我只尝试搜索一个值并填充一个数组时,代码有效。当我尝试填充两个数组时,出现错误“无法分配给数组”。然后我可以像这样切换代码行:
rngIAM_Title = findRanges("IAM_Title")
...
rngIAM_Code = findRanges("IAM_Code")
然后错误发生在另一个数组上。错误可能发生在任何地方:在第一行、中间或最后,但只要我不移动行,它是一致的。再说一次,如果我在子“测试”中只留下一两行带有数组的代码,一切正常。
【问题讨论】:
-
您是否随时 ReDim
rngIAM_Code和rngIAM_Title? -
此外,我认为您遇到的错误是因为您将变量数组分配给数组。如果您将
Dim rngIAM_Code() as range更改为Dim rngIAM_Code as variant,我认为您应该会很好。请注意,这是一个变体数组。 -
foundRanges()和i被初始化为变体。请参阅:stackoverflow.com/a/28238732/To 正确声明它们使用Dim i as Integer, dim foundCount As Integer,或直接使用Dim i as Long, dim foundCount As Long,因为 VBA 无论如何都会将 Integer 存储为 Long(内部)stackoverflow.com/a/26409520 -
另一方面,也许使用
Collection来存储您的范围,这样可以避免重新调光,您可以使用aCollection.Count来获取计数。然后,您也可以只运行for each aSomething in aCollection来遍历每个存储的对象。