24 septiembre, 2023

MATRICES MULTIDIMENSIONALES EN VBA. EJEMPLO PRÁCTICO CON DOS DIMENSIONES

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:

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:

MATRICES MULTIDIMENSIONALES EN VBA. EJEMPLO PRÁCTICO CON DOS DIMENSIONES

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.

Donate Button with Credit Cards

¡¡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

Comparte este post

3 comentarios en «MATRICES MULTIDIMENSIONALES EN VBA. EJEMPLO PRÁCTICO CON DOS DIMENSIONES»

  1. 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.

  2. 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.

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies