Использование массива диапазонов в 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 переменные являются эфемерными, будь то в массиве или коллекции. Если вы хотите закрыть файл и иметь данные там, когда вы открываете его снова, вы должны иметь его в ячейках листа. Листы механизма сохраняемости.
Я собираюсь сделать большой скачок, так что если я далеко, игнорировать меня. То, что я думаю, что вы ищете, предлагает создать отдельный лист в качестве вашей "базы данных", заполненной объектами списка/таблицы, содержащими ваши необработанные данные. Перед этим находится ваш " пользовательский лист" где вы делаете интересные вещи, ссылаясь на данные в таблице базы данных. Назови все.
мне не совсем понятно, о чем вы говорите.
если вы спрашиваете о способности создавать Range
s, что карта ни к чему и существовать самостоятельно, то нет, нет никакого способа. А Range
объект-это просто то, что относится к определенной области рабочего листа. У него нет собственного хранилища или чего-то в этом роде. Несколько различных экземпляров Range
класс может ссылаться на ту же область листа, тоже.
а если вы просто хотите сохранить некоторые ссылки в массиве, тогда все в порядке, вперед. Единственная проблема с вашим кодом заключается в том, что вы не инициализируете элементы массива перед их использованием: как Range
является ссылочным типом, все элементы инициализируются с помощью Nothing
s по умолчанию.