将包含多个范围的分段范围拆分为一组范围的数组?

3
我将尝试将多重范围选择转换为一个范围数组。
目前,我正在尝试以下操作:
Private Function SplitRange(ByRef r As Range) As Range()
    Dim i As Long
    Dim RangesArray() As Range
    Dim AddressArray() As String
    Dim Address As Variant
    i = 0
    AddressArray = Split(r.Address, ",")
    ReDim RangesArray(UBound(AddressArray))
    For Each Address In AddressArray
        Set RangesArray(i) = Range(Address)
        i = i + 1
    Next Address
    ' It works till this point, executing RangesArray(0).Address returns a range address
    SplitRange = RangesArray
    ' Here for some reason neither SplitRange(0).Address or RangesArray(0).Address work
End Function

如何将“复合”范围转换为范围数组?


RangesArray(0).Address 应该可以正常工作(对我来说是这样的)。 SplitRange(0).Address 不起作用,因为它再次调用函数并将 0 作为 Range 传递。 - Rory
1个回答

2
每个 Range 类型的对象都有一个属性 Areas,其中包含其子范围的集合。您可以对该集合中的项进行操作,而不是创建数组。
但是如果您真的需要一个数组,可以轻松地将其转换为以下形式:
Public Function SplitRange(ByRef r As Range) As Range()
    Dim i As Long
    Dim ranges() As Range
    Dim subrange As Range
    '----------------------------------------------------------------

    ReDim ranges(0 To r.Areas.Count - 1)
    For Each subrange In r.Areas
        Set ranges(i) = subrange
        i = i + 1
    Next subrange

    SplitRange = ranges

End Function

2
不错的回答,虽然我想不出将“Areas”从集合转换为数组的好理由。我怀疑OP不知道“Areas”,可能可以直接使用它来实现他们的目的。 - John Coleman
你说得对,我已经修改了我的答案以包含那个。 - mielk

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