Objeto Collection

Al gestionar múltiples datos en VBA, el objeto Collection ofrece una alternativa a los arrays. Las colecciones son más flexibles que los arrays y facilitan la adición y eliminación de datos.

Este artículo cubre desde los conceptos básicos del objeto Collection hasta comparaciones con Dictionary, junto con ejemplos prácticos.

¿Qué es un objeto Collection?

Un objeto Collection es un objeto integrado de VBA que puede almacenar múltiples elementos en secuencia ordenada. Aunque es similar a los arrays, permite operaciones más dinámicas y flexibles.

Características principales

  • Tamaño dinámico: No es necesario declarar el número de elementos por adelantado
  • Tipos de datos mixtos: Puede almacenar cadenas, números, objetos y otros tipos juntos
  • Preservación del orden: Los datos se mantienen en el orden en que se agregaron
  • Especificación de clave: Opcionalmente gestionar datos usando claves
  • Sin configuración adicional: Parte de las funciones estándar de VBA

Comparación con arrays

CaracterísticaCollectionArray
Cambio de tamaño○ Dinámico△ Requiere ReDim
Tipos mixtos○ Permitido× No permitido
Agregar elementos○ Fácil△ Complicado
Eliminar elementos○ Fácil△ Complicado
ÍndiceComienza en 1Comienza en 0*
Rendimiento△ Algo lento○ Rápido

*Los arrays pueden comenzar en diferentes índices según Option Base o el método de declaración

Índice de Collection

Los índices de Collection siempre comienzan en 1. A diferencia de los arrays, nunca comienzan en 0.

Uso básico de Collections

Creación de una instancia

Crea un objeto Collection usando la palabra clave New.

Crear_Collection
Dim myCollection As Collection
Set myCollection = New Collection

' También puedes escribirlo en una línea
Dim myCollection As New Collection

Método Add - Agregar elementos

Usa el método Add para agregar elementos a una Collection.

Agregar_Elementos
Dim fruits As New Collection

' Agregar elementos
fruits.Add "manzana"
fruits.Add "banana"
fruits.Add "naranja"

Debug.Print fruits.Count  ' => 3

Agregar con claves

Puedes especificar opcionalmente una clave al agregar elementos.

Agregar_con_Claves
Dim prices As New Collection

' Primer argumento: valor, Segundo argumento: clave
prices.Add Item:=100, Key:="manzana"
prices.Add 150, "banana"
prices.Add 120, "naranja"

' Recuperar valores usando claves
Debug.Print prices("manzana")   ' => 100
Debug.Print prices("banana")    ' => 150
Claves duplicadas

Intentar agregar un elemento con una clave duplicada causará un error: “Esta clave ya está asociada con un elemento de esta colección.” Las claves deben ser únicas.

Agregar en posiciones específicas

Usa el parámetro Before o After para agregar elementos en posiciones específicas.

Agregar_en_Posicion
Dim items As New Collection

items.Add "Primero"
items.Add "Tercero"

' Agregar después de "Primero"
items.Add "Segundo", After:=1

' Resultado: "Primero", "Segundo", "Tercero"

Propiedad Item - Recuperar elementos

Recupera elementos especificando un índice o clave.

Recuperar_Elementos
Dim fruits As New Collection
fruits.Add "manzana"
fruits.Add "banana"
fruits.Add "naranja"

' Recuperar por índice (comienza en 1)
Debug.Print fruits.Item(1)  ' => manzana
Debug.Print fruits(1)       ' Item puede omitirse

' Recuperar por clave (cuando se agregó con clave)
Dim prices As New Collection
prices.Add 100, "manzana"

Debug.Print prices("manzana")  ' => 100

Método Remove - Eliminar elementos

Elimina elementos especificando un índice o clave.

Eliminar_Elementos
Dim fruits As New Collection
fruits.Add "manzana", "manzana"
fruits.Add "banana", "banana"
fruits.Add "naranja", "naranja"

' Eliminar por índice
fruits.Remove 2

' Eliminar por clave
fruits.Remove "manzana"

Debug.Print fruits.Count  ' => 1

Propiedad Count - Obtener número de elementos

Obtener_Conteo
Dim fruits As New Collection
fruits.Add "manzana"
fruits.Add "banana"

Debug.Print fruits.Count  ' => 2

Iterar a través de una Collection

Usando bucle For Each

La forma más común de iterar a través de una Collection es usando For Each.

Bucle_For_Each
Dim fruits As New Collection
fruits.Add "manzana"
fruits.Add "banana"
fruits.Add "naranja"

Dim fruit As Variant
For Each fruit In fruits
    Debug.Print fruit
Next fruit

Usando bucle For con índice

Bucle_For_con_Indice
Dim fruits As New Collection
fruits.Add "manzana"
fruits.Add "banana"
fruits.Add "naranja"

Dim i As Long
For i = 1 To fruits.Count
    Debug.Print i & ": " & fruits(i)
Next i

Collection vs Dictionary

Tanto Collection como Dictionary pueden almacenar datos como pares clave-valor, pero tienen diferentes fortalezas.

CaracterísticaCollectionDictionary
Verificar existencia× No disponible○ Disponible
Actualizar por clave× No disponible○ Disponible
Obtener todas las claves× No disponible○ Disponible
Configuración de referenciaNo requeridaRequerida*
Velocidad de búsqueda△ Más lento○ Más rápido

*Dictionary requiere la referencia “Microsoft Scripting Runtime” o CreateObject

Cuándo usar Collection

  • Cuando necesitas almacenamiento ordenado sin acceso por clave
  • Cuando quieres mantener el código simple sin referencias externas
  • Cuando el rendimiento no es crítico

Cuándo usar Dictionary

  • Cuando necesitas búsqueda basada en claves
  • Cuando necesitas verificar si existe una clave
  • Cuando se requiere búsqueda de alto rendimiento

Ejemplos prácticos

Eliminar duplicados de datos

Eliminar_Duplicados
Function EliminarDuplicados(sourceArray As Variant) As Collection
    Dim result As New Collection
    Dim item As Variant

    On Error Resume Next
    For Each item In sourceArray
        ' Agregar con la misma clave genera error, así que los duplicados se omiten
        result.Add item, CStr(item)
    Next item
    On Error GoTo 0

    Set EliminarDuplicados = result
End Function

Sub TestEliminarDuplicados()
    Dim data As Variant
    data = Array("manzana", "banana", "manzana", "naranja", "banana")

    Dim uniqueItems As Collection
    Set uniqueItems = EliminarDuplicados(data)

    Dim item As Variant
    For Each item In uniqueItems
        Debug.Print item
    Next item
    ' Salida: manzana, banana, naranja
End Sub

Implementación de pila (LIFO)

Implementacion_Pila
' Pila simple usando Collection
Dim stack As New Collection

Sub Push(value As Variant)
    stack.Add value
End Sub

Function Pop() As Variant
    If stack.Count > 0 Then
        Pop = stack(stack.Count)
        stack.Remove stack.Count
    Else
        Pop = Null
    End If
End Function

Sub TestPila()
    Push "Primero"
    Push "Segundo"
    Push "Tercero"

    Debug.Print Pop()  ' => Tercero
    Debug.Print Pop()  ' => Segundo
    Debug.Print Pop()  ' => Primero
End Sub

Resumen

El objeto Collection es una estructura de datos poderosa en VBA que ofrece flexibilidad más allá de los arrays:

  • Tamaño dinámico: No es necesario especificar el tamaño por adelantado
  • Tipos de datos mixtos: Almacena diferentes tipos en una colección
  • Operaciones fáciles: Operaciones simples de agregar y eliminar
  • Claves opcionales: Accede a elementos por clave cuando sea necesario

Usa Collection cuando necesites almacenamiento simple y ordenado. Para operaciones avanzadas basadas en claves, considera usar Dictionary en su lugar.

#VBA #Collection #Estructura de datos #Programación orientada a objetos