Ниже приведен пример каждого подхода: массив массивов или Dictionary
массивов. Подход словаря значительно проще, чем массив массивов, если то, что вам нужно, - это поиск по ключевым словам. В других случаях могут быть достоинства массива массивов.
Это фиктивный код, не имеющий реальной цели, но чтобы показать пару вещей: захват одного значения и массив значений. Я создаю 2D-массив значений, захватывая некоторые данные Range
, которые являются легкими и 2D. Оттуда я создаю массивы этих значений, а затем помещаю их в соответствующую структуру данных. Затем я ткнул в структуру данных, чтобы получить из нее некоторые значения.
Подход массива массивов показан первым (и выходы слева от рисунка).
Sub ArraysOfArrays()
Dim arrA() As Variant
Dim arrB() As Variant
'wire up a 2-D array
arrA = Range("B2:D4").Value
arrB = Range("F2:H4").Value
Dim arrCombo() As Variant
ReDim arrCombo(2, 1) As Variant
'name and give data
arrCombo(0, 0) = "arrA"
arrCombo(1, 0) = arrA
'add more elements
ReDim Preserve arrCombo(2, 2)
arrCombo(0, 1) = "arrB"
arrCombo(1, 1) = arrB
'output a single result
'cell(2,2) of arrA
Range("B6") = arrCombo(1, 0)(2, 2)
Dim str_search As String
str_search = "arrB"
'iterate through and output arrB to cells
Dim i As Integer
For i = LBound(arrCombo, 1) To UBound(arrCombo, 1)
If arrCombo(0, i) = str_search Then
Range("B8").Resize(3, 3).Value = arrCombo(1, i)
End If
Next i
End Sub
пару ключевых моментов здесь:
- Вы можете только расширить массив, используя
ReDim
. ReDim
очень важно, что вы только change the last dimension of the array при использовании с Preserve
. Поскольку мне нужен один из них, чтобы отслеживать количество записей, я делаю это во втором индексе, который ... неестественен. Если вы знаете размер заранее, этот болезненный шаг пропущен.
- Мой последний массив представляет собой массив 2xN, где 2 содержит имя и массив данных YxZ.
- Чтобы найти данный массив в миксе, вам нужно пройти через все их.
Словарь массивов гораздо меньше кода и более элегантный. Обязательно добавьте ссылку Tools->References
в редакторе VBA в Runtime Microsoft Scripting Runtime.
Sub DictionaryOfArrays()
Dim dict As New Scripting.Dictionary
'wire up a 2-D array
arrA = Range("B2:D4").Value
arrB = Range("F2:H4").Value
dict.Add "arrA", arrA
dict.Add "arrB", arrB
'get a single value
Range("F6") = dict("arrB")(2, 2)
'get a array of values
Range("F8").Resize(3, 3) = dict("arrA")
End Sub
Изображение входных данных и результатов
данных для копирования, если вы хотите его (вставить B1
)
a b
1 2 3 10 11 12
4 5 6 13 14 15
7 8 9 16 17 18
Ваш больший массив должен быть 2-мерным а также: «1st dimension = name», '2nd dimension = this other array'. Получают значения, такие как 'arr (0,1) (0,0)', где вы сначала захватываете массив из внешнего и выкапываете его индексы. Или еще лучше, используйте «Словарь», чтобы вы могли выполнить именованный поиск. Для этого 'key = name' и' value = 2d array'. http://stackoverflow.com/questions/915317/does-vba-have-dictionary-structure –
@Byron Добавление этого в качестве ответа, обеспечивающего простые образцы, было бы замечательно. – L42
@ L42, я добавил ответ, который проходит оба подхода. Спасибо за подсказку. –