Objeto Dictionary
El objeto Dictionary es una de las formas más eficientes de gestionar datos en VBA. Almacena datos como pares clave-valor, permitiendo operaciones flexibles que son difíciles de lograr con arrays u objetos Collection.
Este artículo cubre desde el uso básico de Dictionary hasta ejemplos prácticos.
¿Qué es un objeto Dictionary?
Un objeto Dictionary es una estructura de datos que almacena datos como pares clave-valor. En otros lenguajes de programación, a menudo se llama “array asociativo”, “tabla hash” o “mapa”.
Características principales
- Búsqueda rápida por clave: Accede a valores usando claves arbitrarias en lugar de números de índice
- Garantía de unicidad: No se permiten claves duplicadas, previniendo la duplicación de datos
- Tipos de datos flexibles: Se pueden usar varios tipos de datos para claves y valores
- Tamaño dinámico: No es necesario declarar el tamaño por adelantado, a diferencia de los arrays
Comparación con Collection
| Característica | Dictionary | Collection |
|---|---|---|
| Verificar existencia clave | ○ Disponible | × No disponible |
| Actualizar valor por clave | ○ Disponible | × No disponible |
| Obtener todas las claves | ○ Disponible | × No disponible |
| Búsqueda rápida | ○ Rápida | △ Lenta |
Para usar el objeto Dictionary, necesitas una referencia a “Microsoft Scripting Runtime”. Sin
embargo, también puedes usarlo sin la referencia usando CreateObject("Scripting.Dictionary").
Uso básico de Dictionary
Usando configuración de referencia
En el Editor de VBA, ve a “Herramientas” → “Referencias” y marca “Microsoft Scripting Runtime”.
Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary
' Agregar valores
dict.Add "manzana", 100
dict.Add "banana", 150
dict.Add "naranja", 120
' Recuperar valor
Debug.Print dict("manzana") ' => 100
Usando CreateObject (Recomendado)
Este método funciona sin configuración de referencia, haciéndolo más portable.
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' Agregar valores
dict.Add "manzana", 100
dict.Add "banana", 150
dict.Add "naranja", 120
' Recuperar valor
Debug.Print dict("manzana") ' => 100
El enfoque CreateObject no requiere configuración de referencia y funciona en diferentes
entornos. A menos que tengas razones específicas, se recomienda este método.
Propiedades y métodos principales
Método Add - Agregar elementos
Agrega un nuevo par clave-valor al Dictionary.
dict.Add Key:="manzana", Item:=100
dict.Add "banana", 150 ' Los nombres de argumentos pueden omitirse
' Agregar una clave duplicada genera error
' dict.Add "manzana", 200 ' Error: Esta clave ya está asociada
Llamar a Add con una clave duplicada causa un error. Verifica primero si la clave existe, o usa
la propiedad Item para sobrescribir.
Propiedad Item - Obtener/Establecer valores
Obtiene o establece el valor para una clave especificada.
' Obtener valor
Dim price As Long
price = dict.Item("manzana") ' => 100
price = dict("manzana") ' Item puede omitirse
' Establecer valor (sobrescribir)
dict.Item("manzana") = 200
dict("manzana") = 200 ' Item puede omitirse
' Clave no existente se agrega automáticamente
dict("uva") = 180 ' Se agrega automáticamente
Método Exists - Verificar existencia de clave
Verifica si una clave especificada existe en el Dictionary.
If dict.Exists("manzana") Then
Debug.Print "Manzana existe"
Else
Debug.Print "Manzana no existe"
End If
' Usar en lógica condicional
If Not dict.Exists("melon") Then
dict.Add "melon", 300
End If
Método Remove - Eliminar elementos
Elimina un elemento con la clave especificada.
dict.Remove "banana"
' Eliminar clave no existente genera error
If dict.Exists("melon") Then
dict.Remove "melon"
End If
Método RemoveAll - Eliminar todos los elementos
Elimina todos los elementos del Dictionary.
dict.RemoveAll
Debug.Print dict.Count ' => 0
Método Keys - Obtener todas las claves
Devuelve todas las claves del Dictionary como un array.
Dim allKeys As Variant
allKeys = dict.Keys
Dim i As Long
For i = 0 To UBound(allKeys)
Debug.Print allKeys(i)
Next i
Ejemplos prácticos
Contar frecuencia de palabras
Sub ContarFrecuenciaPalabras()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim words As Variant
words = Array("manzana", "banana", "manzana", "naranja", "banana", "manzana")
Dim word As Variant
For Each word In words
If dict.Exists(word) Then
dict(word) = dict(word) + 1
Else
dict(word) = 1
End If
Next word
' Mostrar resultados
Dim key As Variant
For Each key In dict.Keys
Debug.Print key & ": " & dict(key) & " veces"
Next key
End Sub
Crear tabla de búsqueda
Sub CrearTablaBusqueda()
Dim productPrices As Object
Set productPrices = CreateObject("Scripting.Dictionary")
' Registrar precios de productos
productPrices("P001") = 1000
productPrices("P002") = 1500
productPrices("P003") = 2000
' Buscar precio por código de producto
Dim productCode As String
productCode = "P002"
If productPrices.Exists(productCode) Then
Debug.Print "Precio de " & productCode & ": $" & productPrices(productCode)
Else
Debug.Print "Producto no encontrado"
End If
End Sub
Eliminar duplicados de datos
Function ObtenerValoresUnicos(sourceRange As Range) As Variant
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim cell As Range
For Each cell In sourceRange
If Not IsEmpty(cell.Value) Then
dict(cell.Value) = True ' Usar clave elimina duplicados automáticamente
End If
Next cell
ObtenerValoresUnicos = dict.Keys
End Function
Propiedad CompareMode
La propiedad CompareMode controla cómo se comparan las claves.
| Valor | Constante | Descripción |
|---|---|---|
| 0 | vbBinaryCompare | Distingue mayúsculas (defecto) |
| 1 | vbTextCompare | No distingue mayúsculas |
Sub EjemploCompareMode()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' Distingue mayúsculas (defecto)
dict.CompareMode = vbBinaryCompare
dict.Add "Manzana", 100
dict.Add "manzana", 200 ' Tratada como clave diferente
Debug.Print dict.Count ' => 2
' Reiniciar
Set dict = CreateObject("Scripting.Dictionary")
' No distingue mayúsculas
dict.CompareMode = vbTextCompare
dict.Add "Manzana", 100
' dict.Add "manzana", 200 ' Esto generaría error (clave duplicada)
Debug.Print dict.Count ' => 1
End Sub
CompareMode debe configurarse antes de agregar elementos. Cambiarlo después de agregar elementos
causa un error.
Resumen
El objeto Dictionary es una herramienta poderosa para la gestión eficiente de datos en VBA:
- Búsqueda rápida por clave: Recupera datos instantáneamente usando claves
- Garantía de unicidad: No se permiten claves duplicadas
- Operaciones flexibles: Verifica existencia, actualiza valores, obtiene todas las claves/valores
- Tamaño dinámico: No es necesario declarar el tamaño por adelantado
Domina el objeto Dictionary para escribir código VBA más eficiente y mantenible.