两个范围数组的交集

4
我目前有两个包含范围的数组。你如何获取这两个数组的交集呢?换句话说,我想得到一个仅包含在两个原始数组中都存在的范围的范围数组。我尝试使用 .Intersect,但是我学到它不适用于数组。
数组1:(Range("A1"),Range("B1"),Range("C1")) 数组2:(Range("A1"),Range("A2"), Range("A3"))
结果:(Range("A1"))

你能给一个输入/输出的例子吗? - Tmdean
OP,根据问题的解释和您接受的答案,我认为您想要一个单一的范围,该范围是包含在原始数组中的范围的范围。当前问题提到了想要一个“范围数组”,但我不确定目前是否有太多意义(即结果是标量Range而不是数组Range())。您能否修改您的问题以备后人? :) - Cor_Blimey
1个回答

5

你可以使用这段代码。思路是使用迭代的Union将你的数组合并成一个区间。然后可以使用内置的Intersect

Function IntersectArray(array1() As Range, array2() As Range) As Range
    Dim unionRangeArray1 As Range, unionRangeArray2 As Range
    Dim i As Integer

    Dim lbound1 As Integer: lbound1 = LBound(array1)
    Dim lbound2 As Integer: lbound2 = LBound(array2)

    Set unionRangeArray1 = array1(lbound1)
    Set unionRangeArray2 = array2(lbound2)

    For i = lbound1 + 1 To UBound(array1)
        Set unionRangeArray1 = Application.Union(unionRangeArray1, array1(i))
    Next

    For i = lbound2 + 1 To UBound(array2)
        Set unionRangeArray2 = Application.Union(unionRangeArray2, array2(i))
    Next

    Set IntersectArray = Application.Intersect(unionRangeArray1, unionRangeArray2)
End Function

如果你看了我的问题,我有两个范围数组,而不是两个范围。 - user2844947
+1 做得很好,但是为了任何人的未来使用,我建议您测试下限,因为数组不一定是基于1的。此外,为了避免不必要的重复调用 Union 并将已经在 Union 中的范围(例如,当 r 是 array1(1) 时)考虑使用 For i = x to y 使用 Range.Areas(i) 而不是 For Each r in。 - Cor_Blimey
1
谢谢您的提示,@Cor_Blimey。我会相应地更新我的答案。 - Seb
@Seb 不好意思 - 谢谢你忽略了我关于 Range.Areas 的愚蠢观点 - 我可能喝多了... ;) - Cor_Blimey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接