multidimensional llenar inicializar array arrays vba jagged-arrays

arrays - llenar - object array vb



¿Cómo configuro una “matriz irregular” en VBA? (5)

Tengo un salón de clases lleno de niños, cada uno de los cuales tiene que enumerar sus juguetes favoritos para una tarea. Algunos niños solo listan 1 juguete mientras que otros listan más.

¿Cómo creo una matriz dentada tal que Kids (x) (y) ... donde x es el número de niños en mi clase, y y es la lista de juguetes que mencionan como favoritos?


Jean-Francois señaló que cada elemento puede ser una variedad de longitud variable. Me gustaría añadir que cada elemento también puede ser de otros tipos y no es necesario que sean matrices. Por ejemplo:

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

Los diferentes elementos secundarios pueden ser referenciados dependiendo del tipo implícito de cada uno:

a (2) (1) = 3

a (3) (1) = "a"

a (5) (2,1) = lo que sea que esté en la celda A2.


No necesariamente necesita una matriz irregular para manejar su escenario, ya que una matriz 2D (r, c) también funcionará. Una fila para cada niño y una columna para cada presente. Las dimensiones del arreglo serán (# de hijos, MAX # de regalos) y solo significará que algunas de las ranuras estarán vacías o 0 (según su tipo de datos). Pero al menos de esta manera, no tendrá que volver a ajustar la matriz cada vez que agregue un regalo para un niño.


Puedes utilizar una colección de colecciones.

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

Que da salida a Kid 4, Toy 2 = Kid4Toy2


También puede concatenar la lista de juguetes, por ejemplo, en una cadena separada por tuberías, y luego usar Dividir para convertir la cadena en una matriz cuando sea necesario:

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


"Matriz dentada" es una jerga para una matriz de matrices. El tipo de datos Variant de VBA puede contener casi cualquier cosa *, incluida una matriz. Así que crea una matriz de tipo Variant y asigna a cada uno de sus elementos una matriz de longitud arbitraria (es decir, no todos tienen que tener la misma longitud).

Aquí hay un ejemplo:

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 (e.g. 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

* Una excepción notable son los tipos definidos por el usuario. Las variantes no pueden contener estos.