La cuestión es sencilla... aunque puede llegar a ser mas fácil todavía.
Por cientos de miles de razones (y quizás me quede corto), en muchas oportunidades necesitaremos pasar los datos de un rango determinado a una matriz, para luego trabajarlos sobre la segunda. Dos de los mas comunes: velocidad y preservar los registros originales.
Será necesario aclarar que "ojo con el uso de matrices de gran tamaño", dado que consumirá mas memoria.
Mas allá de eso y de que cada lector aplicará este método a su conveniencia, podemos afirmar que el 99,99% de los usuarios de VBA utilizan un bucle para cargar los datos de un rango hacia una matriz.
La imagen a continuación muestra una de las posibles alternativas:
[+/-] Ver el resto / Ocultar
Para no quedarnos con un solo ejemplo, citemos otro viable:
Ambos procedimientos cumplen con su cometido: hay un rango determinado (en este ejemplo A1:A10) y cada uno de los valores allí presentes se vuelcan a una matriz (unidimensional)
Que bueno, lo logramos. Son 10 valores, así que en una millonésima de segundos la tarea estará concluida y nosotros felices.... pero gran derroche de recursos que hicimos, algo imperdonable en programación.
El Sub CargarMatriz2 es, por llamarlo de algún modo, catastrófico. No solo estamos iterando "a lo loco", si no que también hacemos uso de muchas variables, consumiendo aún mas recursos.
Pensemos que ese rango es A1:A1000 o bien A1: C1000. Si empleamos cualquier bucle (For...Next / For Each / Do While) haremos que el ordenador repita mil veces (o tres mil veces en A1:C1000) lo mismo, mas la tarea de ir asignando a cada espacio de memoria (posición de la matriz) un valor determinado.
Es mucho trabajo y se puede resolver de otra forma: con dos líneas de código. En realidad podría ser una, pero como "purista" del código... declaro la matriz:
ahá, así de fácil.
Declaro una variable llamada Matrix, que al no ponerle un tipo es, de por sí, Variant.
Y después le digo: Matrix es igual al rango A1:A10 ¿Podría ser mas sencillo?
No consumo recursos, no creo objetos, no hago uso excesivo de bucles; creo que de ahora en mas sabrán que alternativa utilizar.
En el rango A1:A10 de mi hoja de cálculos tengo:
Si cargo ese rango en Matrix y luego necesito llevar un valor a una determinada celda (por ej D1), el código sería:
Noten algo particular: debo especificar el segundo argumento de Matrix (columna), como si se tratara de una matriz bidimensional. Si hago: Cells(1,"D")=Matrix(4), la macro arroja un error. Atención a eso, que tiene su lado lógico: en definitiva, y aunque tenga una sola columna, estamos frente a un array bidimensional: diez filas y una columna (A1:A10).
Probemos con otro ejemplo, utilizando un rango mas amplio:
En la imagen superior observarán que cargué todos los valores del rango A1:C5 dentro de Matrix. Luego le indico que en E1 coloque el valor que se encuentra en Matrix(5, 3) [quinta fila, tercer columna): 15. Perfecto, mas aún teniendo en cuenta que para este tipo de matrices deberíamos haber utilizado dos bucles: uno que recorra las filas, y otro para las columnas.
Al final del Sub incorporé la instrucción Erase, para borrar la matriz de la memoria y así liberar recursos, si es que no la voy a utilizar nuevamente.
Suerte.
Comentarios
Publicar un comentario