2015-06-03 4 views
2

У меня есть набор данных, где каждый элемент имеет 2D-массив соответствующей ему информации. Я хотел бы создать 3D-массив, где первое измерение - это имя элемента, а во втором и третьем измерениях - информация, соответствующая элементу.Заполнение 3D-массива 2D-массивами в VBA

Я могу прочитать данные для каждого элемента в 2D-массиве, но я не могу понять, как получить 2D-массив в 3D-массиве.

Я знаю размеры всех измерений, поэтому я могу создать массив фиксированного размера, прежде чем начать процесс чтения и записи.

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

Легко получить 2D-массивы, прочитанные в ArrayList, но я хочу, чтобы иметь возможность называть элементы и быть в состоянии прочитать их обратно, чтобы преуспеть, и кажется сложным сделать с ArrayList.

Вопрос: как я могу прочитать 2D-выбор из excel в массив фиксированного размера 3D в VBA?

+3

Ваш больший массив должен быть 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 –

+0

@Byron Добавление этого в качестве ответа, обеспечивающего простые образцы, было бы замечательно. – L42

+0

@ L42, я добавил ответ, который проходит оба подхода. Спасибо за подсказку. –

ответ

1

Ниже приведен пример каждого подхода: массив массивов или 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 

Изображение входных данных и результатов

data and results

данных для копирования, если вы хотите его (вставить B1)

a    b  
1 2 3  10 11 12 
4 5 6  13 14 15 
7 8 9  16 17 18 
+0

Маленькая точка: 'Redim' - это только то, что вы можете изменить при использовании с' Preserve'. – Rory

+0

@Rory, спасибо. Я добавлю это, чтобы уточнить. –

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