我在使用以下代码时遇到了一些问题。
rng
是一个代表相当大的表的范围。例如。 A1:G600
。 refArr
是行号列表。我需要以下代码才能传回一个范围,以便只能从refArr
中选择rng
中的行。
然而,当我的refArr
太长时(即当它完全超过54个项目时)它会给我一个错误....任何想法为什么会出现这种情况?
Function RangeSelector(rng As Range, refArr As Variant) As Range
Set RangeSelector = Intersect(rng, rng.Range("A" & Replace(Join(refArr, ","), ",", ",A")).EntireRow.Offset(1))
End Function
答案 0 :(得分:2)
问题是Range
的最大字符串长度为255.我们可以使用Union
来解决这个问题。
请注意,即使实际地址更长,Range.address
也只会返回255个字符
在测试中,我使用RangeSelector
选择1到600之间的所有其他行
Sub TestRangeSelector()
Const MAXROWS As Long = 300
Dim refArr(1 To MAXROWS), x As Long
Dim Target As Range
For x = 1 To MAXROWS
refArr(x) = x * 2
Next
Set Target = RangeSelector(Range("A1:G600"), refArr)
Target.Select
Debug.Print "Absolute Address: "; Len(Target.Address), Target.Address
Debug.Print "Relative Address: "; Len(Target.Address(False, False)), Target.Address(False, False)
End Sub
Function RangeSelector(rng As Range, refArr) As Range
Dim s As String, Target As Range, v As Variant, x As Long
For x = LBound(refArr) To UBound(refArr)
s = s & refArr(x) & ":" & refArr(x) & ","
If x = UBound(refArr) Or Len(s) >= 251 Then
s = Left(s, Len(s) - 1)
If Target Is Nothing Then
Set Target = rng.Range(s)
Else
Set Target = Union(Target, rng.Range(s))
End If
s = ""
End If
Next
Set RangeSelector = Intersect(rng, Target)
End Function