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.