jueves, 11 de abril de 2019

VBA: El objeto ArrayList

Aprenderemos algunos aspectos de este curioso objeto ArrayList, que es una estructura de datos muy útil cuando queremos trabajar con rangos dinámicos, pero queremos evitar la molestia de tener que redefinir (Redim) constantemente el tamaño del rango o array.
Los ArrayList no tienen un tamaño fijo, por lo que podemos seguir agregándole elementos constantemente.
A pesar de esta ventaja, en VBA suelo recomendar utilizar la colección -Collection...


Supongamos tenemos una tabla ('TblCiudad') con unas ciudades listadas que deseamos ordenar...

VBA: El objeto ArrayList



Insertamos un módulo estándar, y en esta ventana de código añadiremos nuestra macro:

Sub Ordenar()
Dim arr As Object   'declaramos nuestra ArrayList
'y la matriz con la que trabajaremos
Dim arrTrabajo() As Variant, arrOrdenada() As Variant

Dim rngCiudades As Range
Set rngCiudades = Hoja1.Range("TblCiudad[Ciudades]")

'creamos el objeto ArrayList
Set arr = CreateObject("System.Collections.ArrayList")

'cargamos la matriz con los valores del rango
arrTrabajo = rngCiudades

'añadimos los elementos del rango al ArrayList
For Each elto In arrTrabajo
    arr.Add elto
Next elto

'ordenamos el objeto en Ascendente
arr.Sort
'podríamos ordenar el objeto en Descendente
'arr.Reverse

'Reconvertimos en una Array 'normal' el objeto ArrayList ya ordenado
'y lo almacenamos en una nueva Array
arrOrdenada = arr.ToArray

'finalmente llevamos a la tabla los valores ya ordenados...
For i = 1 To arr.Count
    rngCiudades.Item(i).Value = arrOrdenada(i - 1)
Next i

'También podríamos haber hecho
'Range("ndCiudades").Value = Application.Transpose(arrOrdenada)
End Sub



Curiosa la propiedad .ToArray de este objeto que traslada o transforma los elementos de éste en una array 'normal'.
Otra propiedad muy habitual es .Add que añade elementos al objeto.
También las propiedades .Sort o .Reverse para ordenar en ascendente y descendente, respectivamente, los elementos del objeto.

El resultado final, tras ejecutar la macro, es el esperado...

VBA: El objeto ArrayList

4 comentarios:

  1. la palabra elto o variable donde la declaras?? es que me marca error

    ResponderEliminar
    Respuestas
    1. Hola qué tal?
      un placer saludarte y poder ayudarte.

      No está declarada porque no he trabajado con variables requeridas (con Option Explicit), quizá es tu caso y por esto te falla

      Un cordial saludo

      Eliminar
    2. Si la declaró sería de tipo variant o elto que significa ?

      Eliminar
    3. Hola de nuevo,
      un placer poder responder tus dudas.

      'elto' es una parte de objeto 'arrTrabajo', por tanto son las celdas de un rango

      Saludos cordiales

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.