Использование массива диапазонов в VBA-Excel

поддерживает ли VBA использование массива переменных диапазона?

dim rangeArray() as range
dim count as integer
dim i as integer

count = 3

redim rangeArray(1 to count)

for i = 1 to count
  msgbox rangeArray(i).cells(1,1).value
next

Я не могу заставить его работать в этом типе приложения. Я хочу сохранить ряд диапазонов в определенном порядке как "мастер-копию". Затем я могу добавить, удалить, отсортировать или сделать что-либо с этим массивом, а затем просто распечатать его в ряд диапазонов в excel. Не похоже, что excel поддерживает это - он просто заставляет вас хранить данные в электронной таблице, и вам нужно перечитывать их, чтобы использовать.

3 ответов


нет, массивы не могут содержать объекты. Но, ообъекты могут содержать объекты. Я думаю, что вы можете захотеть объект диапазона, который состоит из различных конкретных других объектов диапазона. В этом примере rMaster-это мой "массив", который содержит три ячейки.

Sub StoreRanges()

    Dim rMaster As Range
    Dim rCell As Range

    Set rMaster = Sheet1.Range("A1")
    Set rMaster = Union(rMaster, Sheet1.Range("A10"))
    Set rMaster = Union(rMaster, Sheet1.Range("A20"))

    For Each rCell In rMaster
        MsgBox rCell.Address
    Next rCell

End Sub

С моими новыми знаниями о том, что массивы могут содержать диапазоны (thnx jtolle), вот пример того, как вы будете хранить диапазоны в массиве и сортировать их

Sub UseArray()

    Dim aRng(1 To 3) As Range
    Dim i As Long

    Set aRng(1) = Range("a1")
    Set aRng(2) = Range("a10")
    Set aRng(3) = Range("a20")

    BubbleSortRangeArray aRng

    For i = LBound(aRng) To UBound(aRng)
        Debug.Print aRng(i).Address, aRng(i).Value
    Next i

End Sub

Sub BubbleSortRangeArray(ByRef vArr As Variant)

    Dim i As Long, j As Long
    Dim vTemp As Variant

    For i = LBound(vArr) To UBound(vArr) - 1
        For j = i To UBound(vArr)
            If vArr(i).Value > vArr(j).Value Then
                Set vTemp = vArr(i)
                Set vArr(i) = vArr(j)
                Set vArr(j) = vTemp
            End If
        Next j
    Next i

End Sub

не совсем понятно, что вы хотите сделать, но...

Если вы хотите коллекцию, почему бы не использовать объект коллекции VBA?

Dim myRanges as New Collection

Коллекция.Item может быть любым объектом, включая диапазон.

объект диапазона не содержит данных; он содержит ссылку на ячейки. Если вы хотите диапазон содержание в вашей коллекции вам придется скопировать их на рабочий лист и с него.

как с Java, ваш VBA переменные являются эфемерными, будь то в массиве или коллекции. Если вы хотите закрыть файл и иметь данные там, когда вы открываете его снова, вы должны иметь его в ячейках листа. Листы механизма сохраняемости.

Я собираюсь сделать большой скачок, так что если я далеко, игнорировать меня. То, что я думаю, что вы ищете, предлагает создать отдельный лист в качестве вашей "базы данных", заполненной объектами списка/таблицы, содержащими ваши необработанные данные. Перед этим находится ваш " пользовательский лист" где вы делаете интересные вещи, ссылаясь на данные в таблице базы данных. Назови все.


мне не совсем понятно, о чем вы говорите.

если вы спрашиваете о способности создавать Ranges, что карта ни к чему и существовать самостоятельно, то нет, нет никакого способа. А Range объект-это просто то, что относится к определенной области рабочего листа. У него нет собственного хранилища или чего-то в этом роде. Несколько различных экземпляров Range класс может ссылаться на ту же область листа, тоже.

а если вы просто хотите сохранить некоторые ссылки в массиве, тогда все в порядке, вперед. Единственная проблема с вашим кодом заключается в том, что вы не инициализируете элементы массива перед их использованием: как Range является ссылочным типом, все элементы инициализируются с помощью Nothings по умолчанию.