martes, 18 de noviembre de 2025

Despídete de los Bucles Lentos: Simulación de Iteraciones con FILTRO y UNICOS

 

Durante años, la automatización de tareas en Excel que requerían procesar un subconjunto de datos (como iterar sobre clientes únicos o procesar solo las filas que cumplen una condición) se hacía obligatoriamente con bucles de VBA (For Each, Do While).

Esto funciona, pero es lento y el código se vuelve denso.

Con la llegada de las Funciones de Matriz Dinámica (DAF) en Microsoft 365, podemos simular la lógica de esos bucles complejos directamente en la hoja de cálculo. Esta técnica no solo es más rápida (está optimizada por el motor de cálculo de Excel), sino que simplifica la lógica de tu código VBA, permitiéndole operar con el resultado final, no con la iteración.


🧠 El Problema: El Bucles Anidado Clásico

Imagina que quieres calcular el saldo total para cada cliente único que tiene una cuenta "Activa".

🐌 Solución VBA Tradicional (Lenta):

  1. Crear un Dictionary para obtener la lista de clientes únicos.

  2. Iterar sobre la lista de clientes (For Each Cliente...).

  3. Dentro, iterar sobre el rango de datos principal (For Each Fila...).

  4. Usar una condición If para sumar el saldo si coincide el cliente y la condición "Activa".

Este proceso requiere dos bucles anidados y la constante lectura/escritura en celdas, haciendo que el rendimiento sea pésimo para más de 10,000 filas.


✨ La Solución Pro: Simulación de Bucle con DAF

Podemos reemplazar toda esa lógica VBA usando dos sencillas funciones en la hoja de cálculo y un código VBA mínimo para automatizar el proceso de "disparar" el cálculo.

Paso 1: Obtener los Elementos Únicos (UNICOS)

El primer paso de cualquier bucle de agregación es determinar sobre qué se va a iterar. En nuestro caso, los clientes únicos.

En una celda (ej. G2), simplemente utiliza la función UNICOS:

Excel
=UNICOS(A2:A100)

La columna G se desbordará automáticamente, listando cada cliente una sola vez. ¡Esto es el equivalente a nuestro bucle externo (For Each Cliente) sin usar una sola línea de VBA!

Paso 2: Filtrar y Agregar por Condición (FILTRO + SUMA)

Ahora que tenemos la lista única, necesitamos el cálculo (saldo) para cada uno. Usaremos una función auxiliar (ej. SUMAR.SI o SUMA) en combinación con FILTRO.

En la celda H2 (justo al lado del primer cliente en G2#), introduce la siguiente fórmula:

Excel
=SUMA(FILTRO(B2:B100; (A2:A100 = G2#) * (C2:C100 = "Activa")))

Analicemos la magia:

  • G2#: La almohadilla (#) indica que la fórmula está haciendo referencia a todo el rango desbordado de la función UNICOS. ¡Esto simula la iteración!

  • (A2:A100 = G2#): Crea una matriz lógica que es VERDADERO solo para el cliente actual en la lista única.

  • * (C2:C100 = "Activa"): Añade la segunda condición (AND).

  • FILTRO(...): Filtra el rango de Saldos (B2:B100) solo para las filas donde ambas condiciones son VERDADERO.

  • SUMA(...): Suma los saldos filtrados.

El resultado es un rango de desbordamiento en H2# que calcula el total de saldo activo para cada cliente de la lista única, todo en una sola línea de fórmula y sin bucles de VBA.

Paso 3: El Toque Final con VBA (Disparador)

El rol del VBA se reduce a una acción simple y ultrarrápida: tomar el resultado de la hoja y transferirlo donde sea necesario (una base de datos, otro informe, etc.).

VBA
Sub ProcesarSaldosDAF()
    ' Desactivar actualizaciones de pantalla para velocidad
    Application.ScreenUpdating = False

    Dim RangoResultados As Range
    ' Referencia a los resultados completos del rango de desbordamiento H2#
    On Error Resume Next
    Set RangoResultados = Range("H2#")
    On Error GoTo 0
    
    If Not RangoResultados Is Nothing Then
        ' Enviar los resultados (clientes + saldos) a otro lugar
        ' Esto reemplaza la necesidad de VBA para hacer los cálculos uno a uno.
        RangoResultados.Copy Destination:=ThisWorkbook.Sheets("Resultados").Range("A1")
    End If
    
    Application.ScreenUpdating = True
End Sub

✅ Conclusión

Al externalizar la lógica iterativa y condicional a las Funciones de Matriz Dinámica, hemos pasado de un bucle de VBA lento y complejo a una fórmula de hoja de cálculo única con un código VBA que solo actúa como un eficiente motor de transferencia de datos.

¡Rendimiento por encima de todo! Es el camino a seguir para cualquier experto que trabaje con Microsoft 365.

No hay comentarios:

Publicar un comentario

El Problema: El Infierno de los SI Anidados

 Si alguna vez has intentado crear una fórmula con múltiples condiciones y terminaste con una "sopa de paréntesis" imposible de le...