2015-12-22 5 views
2

Я пытаюсь преобразовать множественный выбор диапазона в массив диапазонов.Сплит-диапазон, содержащий несколько диапазонов в массив диапазонов?

Прямо сейчас это то, что я пытаюсь:

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 

Как я могу преобразовать «соединение» диапазон в массив диапазонов?

+0

'RangesArray (0) .Address' должно работать нормально (делает для меня). 'SplitRange (0) .Address' не будет работать, потому что он снова вызывает функцию' 0' как 'Range'. – Rory

ответ

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' из коллекции в массив. Я подозреваю, что ОП не знал о «Районах» и, возможно, просто использовал его непосредственно для своих целей. –

+0

Вы правы, я изменил свой ответ, чтобы включить это. – mielk

Смежные вопросы