使用intersect(replace(join()))sub的问题

时间:2016-11-25 12:11:49

标签: vba

我在使用以下代码时遇到了一些问题。

rng是一个代表相当大的表的范围。例如。 A1:G600refArr是行号列表。我需要以下代码才能传回一个范围,以便只能从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

1 个答案:

答案 0 :(得分:2)

问题是Range的最大字符串长度为255.我们可以使用Union来解决这个问题。

请注意,即使实际地址更长,Range.address也只会返回255个字符

enter image description here

在测试中,我使用RangeSelector选择1到600之间的所有其他行

enter image description here

测试

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

RangeSelector

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