【问题标题】:Intersection of two arrays of ranges两个范围数组的交集
【发布时间】:2014-07-04 05:41:37
【问题描述】:

我目前有两个数组,每个数组都包含范围。您将如何获得这两个数组的交集。换句话说,我想得到一个范围数组,它只包含两个原始数组中包含的范围。我尝试了 .Intersect ,但据我所知,这不适用于数组。

array1: (Range("A1"),Range("B1"),Range("C1")) 数组2:(范围(“A1”),范围(“A2”),范围(“A3”))

结果:(范围(“A1”))

【问题讨论】:

  • 你能举一个输入/输出的例子吗?
  • OP 我认为您的意思是-根据对问题的解释和您接受的答案-您需要一个 Range,即包含在两个原始数组中的 Range 范围。当前的问题提到想要一个“范围数组”,我不确定在存在时是否有意义(即结果是标量Range 而不是数组Range())。您是否可以为后代修改您的问题? :)

标签: arrays vba range intersection


【解决方案1】:

您可以使用此代码。这个想法是使用迭代 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

【讨论】:

  • 如果您阅读我的问题,我有两个范围数组,而不是两个范围。
  • +1 做得很好,但是,为了任何人的未来使用,我建议您测试下限,因为数组不需要以 1 为基数。此外,为了节省对 Union 的不必要的重复调用,使用已经在 Union 中的范围(例如,目前当 r 为 array1(1) 时)可能考虑使用 For i = x to y 使用 Range.Areas(i) 而不是 For Each r in)。
  • 感谢@Cor_Blimey 的提示,我会相应地更新我的答案。
  • @Seb 哎呀 - 谢谢你忽略了我关于 Range.Areas 的愚蠢观点 - 我一定有太多... ;)
猜你喜欢
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
相关资源
最近更新 更多