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ísticaDictionaryCollection
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
Configuración de referencia

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

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

Usando_CreateObject
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
Enfoque recomendado

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.

Metodo_Add
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
Claves duplicadas

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.

Propiedad_Item
' 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.

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

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

Metodo_RemoveAll
dict.RemoveAll

Debug.Print dict.Count  ' => 0

Método Keys - Obtener todas las claves

Devuelve todas las claves del Dictionary como un array.

Metodo_Keys
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

Frecuencia_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

Tabla_Busqueda
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

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

ValorConstanteDescripción
0vbBinaryCompareDistingue mayúsculas (defecto)
1vbTextCompareNo distingue mayúsculas
CompareMode
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
Configurar CompareMode

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.

#VBA #Dictionary #Estructura de datos #Eficiencia