Использование массива диапазонов в VBA - Excel - PullRequest
6 голосов
/ 02 сентября 2010

Поддерживает ли 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 ]

11 голосов
/ 03 сентября 2010

Нет, массивы не могут содержать объекты.Но o Объекты могут содержать объекты.Я думаю, что вы можете захотеть это объект Range, который состоит из различных других конкретных объектов Range.В этом примере 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
4 голосов
/ 03 сентября 2010

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

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

Dim myRanges as New Collection

Collection.Item может быть любым объектом, включая Range.

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

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

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

1 голос
/ 03 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...