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):
Crear un
Dictionarypara obtener la lista de clientes únicos.Iterar sobre la lista de clientes (
For Each Cliente...).Dentro, iterar sobre el rango de datos principal (
For Each Fila...).Usar una condición
Ifpara 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:
=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:
=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ónUNICOS. ¡Esto simula la iteración!(A2:A100 = G2#): Crea una matriz lógica que esVERDADEROsolo 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 sonVERDADERO.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.).
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