Hola a todos:
Esta semana recibí una consulta sobre matrices (arrays) multidimensionales. En concreto sobre las matrices de 2 dimensiones, dado que la necesidad era para datos establecidos en una hoja Excel y los elementos o las dimensiones eran las filas y las columnas. La consulta era para saber cómo rellenar la matriz desde Excel.
Sobre matrices os dejo enlaces en microsoft y que creo que os pueden interesar interesantes:
- https://docs.microsoft.com/es-es/dotnet/visual-basic/programming-guide/language-features/arrays/
- https://docs.microsoft.com/es-es/office/vba/language/concepts/getting-started/using-arrays
Voy a ser breve con este ejemplo, porque lo que voy a realizar es el ejemplo de rellenar una matriz y pasar los datos de nuevo a Excel a otra hoja.
Vamos con el ejemplo:
La idea es leer todos estos datos, pasarlos a una matriz (MiArray) y pasarlos a la hoja2 de nuestros archivo de ejemplo. Esto lo vamos a realizar con el siguiente código:
Option Explicit
Sub ARRAY_MULTIDIMENSIONAL()
'Declaramos variables
Dim i As Long, j As Long, final As Long, fin As Long
Dim n As Long, x As Long
With Sheets(1)
'Capturamos límite de fila y columna
final = Application.CountA(.Range("1:1"))
fin = Application.CountA(.Range("A:A"))
'Redimensionamos nuestra matriz
ReDim MiArray(1 To fin, 1 To final)
'Rellenamos matriz
For i = 1 To fin
For j = 1 To final
MiArray(i, j) = .Cells(i, j)
Next j
Next i
End With
'Pasamos los datos de la matriz a la hoja2
For n = 1 To fin
For x = 1 To final
Sheets(2).Cells(n, x) = MiArray(n, x)
Next x
Next n
End Sub
El resultado es el esperado, los datos de la hoja1 pasan a la hoja2. Obviamente, este ejercicio es muy sencillo, pero es útil para saber cómo funciona y se comportan las matrices.
Si necesitamos modificar el contenido de lo que estamos pasando a la matriz, podemos utilizar condicionales o cualquier otra estructura para indicar mediante una regla qué datos deseamos modificar o leer.
Y esto ha sido todo, es un post corto, pero que aclara perfectamente cómo utilizar este tipo de matrices, cómo llenarlas, cómo leerlas y como «moverlas».
Descarga el archivo de ejemplo pulsando en: MATRICES MULTIDIMENSIONALES EN VBA. EJEMPLO PRÁCTICO CON DOS DIMENSIONES
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
Aunque el resultado es el esperado, se desvirtúa el uso de VBA en Excel, ya que no se emplea su paradigma de objetos empleándose una programación común en lenguajes imperativos.
Se usa un with sin ninguna funcionalidad en el código, quizás para hacer más clara la lectura al lector, pero si hubiera sido un código indentado no habría estado mal.
No hace falta usar ni Select ni Activate cuando se trabaja en VBA excepto en casos muy excepcionales, como al finalizar una macro y posicionar al usuario en una hoja en concreto.
Su mismo ejemplo pero eliminando variables que no hace falta declarar, haciendo uso del with e indentando.
[code]
Sub MoverRangosConMatrices()
‘Declaramos variables
Dim i As Long, j As Long, ultimaFila As Long, ultimaColumna As Long
With sheets(1)
‘Capturamos limite de fila y columna
ultimaColumna = .Cells(1, .Columns.Count).End(xlToLeft).Column
ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row
‘Redimensionamos nuestra matriz
ReDim MiArray(1 To ultimaFila, 1 To ultimaColumna)
‘Rellenamos matriz
For i = 1 To ultimaFila
For j = 1 To ultimaColumna
MiArray(i, j) = .Cells(i, j)
Next j
Next i
End With
‘Pasamos los datos de la matriz a la hoja2
For i = 1 To ultimaFila
For j = 1 To ultimaColumna
sheets(2).Cells(i, j) = MiArray(i, j)
Next j
Next i
End Sub
[/code]
Aunque le dejo mi sugerencia usando los modelos de objetos de Excel:
[code]Sub TLD_MoverRangosConMatrices()
‘Declaramos variables
Dim pFila As Long, pCol As Long, uFila As Long, uCol As Long
Dim vMatriz As Variant
With HojaDatosDos
‘Asignamos el rango a la matriz. Se recomienda el uso de Value2 para no truncar valores de tipo moneda o fecha.
vMatriz = .UsedRange.Value2
End With
With DatosMovidos
‘Asignamos los límites de la matriz a variables para clarificar código
pFila = LBound(vMatriz, 1)
pCol = LBound(vMatriz, 2)
uFila = UBound(vMatriz, 1)
uCol = UBound(vMatriz, 2)
‘Asignamos la matriz al rango, y como se intuye deben tener las mismas filas y columnas para evitar truncar datos
.Range(.Cells(pFila, pCol), .Cells(uFila, uCol)) = vMatriz
End With
End Sub
[/code]
Un saludo y espero que mi mensaje se tome como algo colaborativo y no crítico.
Por lo que veo WordPress elimina el indentado, ¡qué maravilla! XD
Hola:
Pues sí, en efecto, cuando estaba en wordpress.com no había forma de indentar el código. Hace un migré a .org y ahora me permite hacerlo, aunque en los comentario no es posible.
En cuanto al with, es evidente que tendría que haber eliminado Sheets(1) en las líneas correspondientes, pero es como me suele pasar cuando hago las cosas con prisas. Si tengo tiempo lo modificaré. En el ejemplo que aportas los with generar error al no especificar la hoja, pero el resultado está genial.
Esta entrada está basada en un post anterior sobre cómo mover datos entre hojas, entre ellos tu propuesta: https://excelsignum.com/2016/06/08/procedimientos-en-vba-para-mover-datos-entre-hojas/
Y muchas gracias por el aporte, el mero hecho de argumentar lo convierte en una aportación y no en una crítica.
Saludos.