Descargar el fichero pasa_matriz.xlsm.
Deseamos transferir los datos que existen en el rango de una hoja a una matriz (ARRAY) mediante una macro. Vamos a verlo por varios métodos. El primer método es el clásico, cargando dato a dato en la matriz. Otro método nos permite cargar la matriz de una sola vez. También vamos a conocer cómo se determina la dimensión de una matriz.
Método Clásico
Podemos utilizar el método clásico que consiste en tomar los datos uno a uno del rango e ir alimentando la matriz. Esto se puede hacer con bucles FOR..NEXT.
Imagine que el rango es B4:D13 y esta lleno de datos (algunos numéricos y otros alfanuméricos). Queremos trasladar todos los datos a la matriz X de dimensión X(1 to 10, 1 to 3).
Utilicemos el método clásico consistente en pasar los datos del rango a la matriz de uno en uno. Esto se hace utilizando, en este caso, dos bucles FOR..NEXT anidados.
Sub pasardatos()El otro método es pasar el rango de datos de una sola vez a la matriz.
Dim MiMatriz(1 To 10, 1 To 3)
Dim i As Integer, j As Integer
For i = 1 To 10
For j = 1 To 3
MiMatriz(i, j) = Worksheets("Hoja1").Cells(3 + i, j + 1).Value
Next j
Next i
End Sub
Pruebe con esto:
MiMatriz = [B4:D13]o bien
MiMatriz = Range("B4:D13")y tambien funciona al reves:
[F4:H13] = MiMatrizo bien
Range("F4:H13") = MiMatrizSe ha de tener en cuenta que si declaras la matriz como una matriz dará error.
Declarando la variable como una matriz no funciona.
Me explico. Si prueba las cuatro siguientes macros:
Sub Matrix1()comprobara que las dos primeras macros dan error. Las que funcionan bien son la tercera y la cuarta.
Dim X(11, 5)
X = Range("B4:D13")
End Sub
Sub Matrix2()
Dim X As Double
X = Range("B4:D13")
End Sub
Sub Matrix3()
Dim X As Variant
X = Range("B4:D13")
End Sub
Sub Matrix4()
Dim X
X = Range("B4:D13")
End Sub
Si lo que queremos es tomar un valor de la matriz (por ejemplo el primero, el de la celda B4) y luego dejarlo en la celda H1 hacemos lo siguiente.
¿Cómo se puede conocer la dimensión de la matriz creada?
Supongamos que creo una función, como esta:
ejemplo, sería interesante saber si tiene 10 filas y 4 columnas, o la
dimensión de que se trate. ¿Cómo saber esto?.
Sub test()
Dim x
x = [B4:D13]
[H1]= x(1, 1)
End Sub
¿Cómo se puede conocer la dimensión de la matriz creada?
Supongamos que creo una función, como esta:
Function MiRef(Rng)Para tratar los elementos de la matriz debo conocer su dimensión. Por
Dim X
X = [Rng]
'......
End Function
ejemplo, sería interesante saber si tiene 10 filas y 4 columnas, o la
dimensión de que se trate. ¿Cómo saber esto?.
Disponemos de dos métodos:
1) Tomar las dimensiones del rango a la hora de asignar:
Function test1(rng As Range) As String
Dim Matriz, x As Long, y As Long
Matriz = rng
x = rng.Columns.Count
y = rng.Rows.Count
test1 = "Matriz ( 1 To " & y & " , 1 To " & x & ")"
End Function
2) Tomar las dimensiones de la matriz:
Function test2(rng As Range) As String
Dim Matriz, x As Long, y As Long
Matriz = rng
x = UBound(Matriz, 2)
y = UBound(Matriz, 1)
test2 = "Matriz ( 1 To " & y & " , 1 To " & x & ")"
End Function