Como faço para configurar um “array irregular” no VBA?

Eu tenho uma sala de aula cheia de crianças, cada uma das quais tem que listar seus brinquedos favoritos para uma tarefa. Algumas crianças apenas listam 1 brinquedo enquanto outras listam mais.

Como faço para criar um array irregular de tal forma que Kids (x) (y) … onde x é o número de filhos em minha class, e y é a lista de brinquedos que eles listam como favoritos?

“Jagged array” é uma gíria para array de arrays. O tipo de dados Variant do VBA pode conter praticamente qualquer coisa *, incluindo uma matriz. Portanto, você cria uma matriz do tipo Variant e atribui a cada um dos seus elementos uma matriz de comprimento arbitrário (ou seja, nem todos eles têm que ter comprimento igual).

Aqui está um exemplo:

 Dim nStudents As Long Dim iStudent As Long Dim toys() As Variant Dim nToys As Long Dim thisStudentsToys() As Variant nStudents = 5 ' or whatever ReDim toys(1 To nStudents) ' this will be your jagged array For iStudent = 1 To nStudents 'give a random number of toys to this student (eg up to 10) nToys = Int((10 * Rnd) + 1) ReDim thisStudentsToys(1 To nToys) 'code goes here to fill thisStudentsToys() 'with their actual toys toys(iStudent) = thisStudentsToys Next iStudent ' toys array is now jagged. ' To get student #3's toy #7: MsgBox toys(3)(7) 'will throw an error if student #3 has less than 7 toys 

* Uma exceção notável é o tipo definido pelo usuário. Variantes não podem conter estes.

Você pode usar uma coleção de collections

 Public Sub Test() Dim list As New Collection Dim i As Integer, j As Integer Dim item As Collection For i = 1 To 10 Set item = New Collection For j = 1 To i item.Add "Kid" & CStr(i) & "Toy" & CStr(j) Next j list.Add item Next i Debug.Print "Kid 4, Toy 2 = " & list(4)(2) End Sub 

Qual saída Kid 4, Toy 2 = Kid4Toy2

Jean-François apontou que cada elemento pode ser um conjunto de tamanhos variados. Gostaria de acrescentar que cada elemento também pode ser de outros tipos e não precisa ser matrizes. Por exemplo:

 Dim c as New Collection Dim a(1 to 5) as Variant c.Add "a","a" c.Add "b","b" a(1) = 5 a(2) = Array(2,3,4) set a(3) = c a(4) = "abcd" a(5) = Range("A1:A4").Value 

Os vários elementos filho podem ser referenciados dependendo do tipo implícito de cada um:

a (2) (1) = 3

a (3) (1) = “a”

a (5) (2,1) = o que quer que esteja na célula A2.

Você também pode concatenar a lista de brinquedos em uma string separada por pipe e usar Split para transformar a string em uma matriz quando necessário:

 Sub UntangleTheString() Dim sToys As String Dim aToys() As String Dim x As Long sToys = "baseball|doll|yoyo" aToys = Split(sToys, "|") For x = LBound(aToys) To UBound(aToys) Debug.Print aToys(x) Next End Sub 

Você não precisa necessariamente de um array irregular para lidar com o seu cenário, pois um array 2D (r, c) também funcionará. Uma linha para cada criança e uma coluna para cada presente. As dimensões da matriz serão (# de filhos, MAX # de presentes) e isso significará apenas que alguns dos slots estarão vazios ou 0 (dependendo do tipo de dados). Mas pelo menos dessa maneira você não precisará redimir a matriz toda vez que adicionar um presente a uma criança.