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ística | Collection | Array |
|---|---|---|
| Cambio de tamaño | ○ Dinámico | △ Requiere ReDim |
| Tipos mixtos | ○ Permitido | × No permitido |
| Agregar elementos | ○ Fácil | △ Complicado |
| Eliminar elementos | ○ Fácil | △ Complicado |
| Índice | Comienza en 1 | Comienza 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
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.
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.
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.
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
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.
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.
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.
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
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.
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
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ística | Collection | Dictionary |
|---|---|---|
| Verificar existencia | × No disponible | ○ Disponible |
| Actualizar por clave | × No disponible | ○ Disponible |
| Obtener todas las claves | × No disponible | ○ Disponible |
| Configuración de referencia | No requerida | Requerida* |
| 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
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)
' 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.