Esta es una fórmula que llegó a una hoja de precios real, y no es ni de lejos la peor que se ha escrito este año:
=D2*E2-D2*E2*SI(D2*E2>=5000;0,12;SI(D2*E2>=2500;0,08;SI(D2*E2>=1000;0,04;0)))
Es correcta. Devuelve 2.382,80, que es la respuesta buena. Y D2*E2 aparece cinco veces, lo que significa tres cosas a la vez: quien la lea tiene que deducir cinco veces que D2*E2 es el valor del pedido, Excel tiene cinco sitios donde evaluarlo, y el día en que alguien añada una columna de unidades por caja habrá cinco ediciones que hacer y con cuatro ya está el desastre montado.
El arreglo no es una fórmula más corta. Es una fórmula que puede decir en voz alta las palabras "valor del pedido":
=LET(valor; D2*E2;
tasa; SI.CONJUNTO(valor>=5000; 0,12; valor>=2500; 0,08; valor>=1000; 0,04; VERDADERO; 0);
valor - valor*tasa)
La misma respuesta. Un único sitio donde cambiarla. Y una segunda persona puede leerla.
Eso es LET: permite que una fórmula ponga nombre a sus propios resultados intermedios. LAMBDA, su pareja, va un paso más allá — permite que una fórmula reciba argumentos, lo que la convierte en una función a la que puedes poner nombre y llamar desde cualquier punto del libro, igual que a SUMA. Entre las dos son el mayor cambio en la forma de escribir fórmulas desde las matrices dinámicas, y casi ninguna hoja se ha enterado todavía.
Qué necesitas.
LETestá en Microsoft 365, en Excel 2021 y posteriores, y en Excel para la web.LAMBDAy sus ayudantes (MAP,BYROW,SCAN,REDUCE,MAKEARRAY) están en Microsoft 365, en Excel 2024 y en Excel para la web — no en Excel 2021. Google Sheets tiene las dos, más Funciones con Nombre en lugar del Administrador de nombres. En versiones antiguas, un libro que use cualquiera de las dos se abre con_xlfn.LETy_xlfn.LAMBDAdentro de las fórmulas y#¿NOMBRE?en las celdas — sección 13.
1) Dos Problemas Que Parecen Distintos y No Lo Son
Las fórmulas largas se estropean de dos maneras, y la gente las trata como quejas separadas.
La primera es la repetición. Una subexpresión que aparece más de una vez — D2*E2, un BUSCARX del que necesitas tanto el valor como la comprobación, una diferencia de fechas que se usa en tres ramas. Cada copia es algo que mantener y algo que leer.
La segunda es la falta de nombres. Incluso una fórmula sin ninguna repetición se vuelve ilegible cuando tiene tres ideas de profundidad, porque ninguna de esas ideas tiene nombre. =SI(HOY()-C2>30; (D2*E2)*0,02; 0) es aritmética; el recargo por demora es el 2% del valor del pedido cuando la factura pasa de 30 días es una frase. La fórmula contiene la frase y se niega a decirla.
LET arregla las dos con un solo movimiento, y la razón es que los dos problemas son el mismo problema: un valor que le importa al lector no tiene dónde vivir salvo dentro de la expresión que lo produjo. Ponle nombre y la repetición se convierte en una referencia, y aparece la frase.
Lo primero que se le ocurre a mucha gente son las columnas auxiliares, y las columnas auxiliares son buenas de verdad — se ven, se auditan, y cualquiera que revise la hoja las tiene delante. LET es lo que usas cuando el intermedio no merece una columna: porque son demasiados, porque la hoja la diseñó otra persona y no puedes ensancharla, o porque el valor solo tiene sentido dentro de este cálculo concreto. No son rivales. Una hoja con once columnas auxiliares que nadie sabe nombrar es tan mala como una fórmula con once paréntesis anidados.
2) La Sintaxis, y el Número Impar
=LET(nombre1; valor1; [nombre2; valor2]; ...; cálculo)
Parejas, y luego un último argumento que es la respuesta de verdad. De ahí sale la regla que pilla a todo el mundo una vez:
El número de argumentos siempre es impar. Tres, cinco, siete, nueve. Un número par significa que has escrito un nombre sin valor o — mucho más habitual — que te has dejado el cálculo del final y Excel está mirando tu última pareja nombre/valor como si fuera la respuesta. Excel rechaza la entrada en lugar de adivinar.
Cuatro reglas más, todas importantes después:
- Los nombres se declaran de izquierda a derecha, y un nombre solo ve a los anteriores.
LET(b; a*2; a; 10; b)falla;LET(a; 10; b; a*2; b)es la misma idea en el orden correcto. - Cada nombre se calcula una sola vez, y se reutiliza allí donde aparezca. Es una promesa sobre la evaluación, no solo sobre lo que escribes, y la sección 7 es lo que te compra.
- Los nombres existen solo dentro de esta fórmula. No aparece nada en el Administrador de nombres, la celda de al lado no ve nada, y dos fórmulas pueden usar
tasapara cosas distintas sin conflicto. - Hasta 126 parejas nombre/valor, cifra a la que no vas a llegar nunca, y que deberías tomarte como aviso si te acercas.
El último argumento no tiene por qué usar todos los nombres — un LET cuyo cálculo final ignora la mitad de sus declaraciones es legal, y suele ser una fórmula que alguien editó mal.
3) Reescribir el Monstruo
🎯 Escenario: Siete pedidos, un descuento por tramos, y una columna de valor neto que tiene que estar bien para el jueves.
La cuadrícula de abajo es la hoja. Unidades en D, precio unitario en E, y F está vacía porque esta sección la rellena. Las reglas de descuento son las de siempre: 4% desde 1.000, 8% desde 2.500, 12% desde 5.000.
Siete Pedidos, y la Columna Que Este Artículo Rellena
Unidades en D, precio unitario en E, y F vacía a propósito. La escalera de descuentos es la de cualquier hoja de ventas — 4% desde 1.000, 8% desde 2.500, 12% desde 5.000 — y la fórmula que la aplica es la del principio del artículo, con D2*E2 escrito cinco veces. Merece la pena vigilar dos filas: SO-1043, con 2.490, se queda justo por debajo del umbral del 8%, y SO-1047, con 2.527, justo por encima. Treinta y siete de negocio extra, y la sección 14 calcula lo que te cuesta.
fxLas celdas con fórmulas están resaltadas en verde
Pasa el mouse sobre las celdas con fórmulas para ver la fórmula y resaltar las celdas referenciadas
Escrito como una sola expresión sale la fórmula del principio del artículo — cinco D2*E2. Escrito con LET, y maquetado con Alt+Intro dentro de la barra de fórmulas, es un programa de cinco líneas:
=LET(
valor; D2*E2;
tasa; SI.CONJUNTO(valor>=5000; 0,12; valor>=2500; 0,08; valor>=1000; 0,04; VERDADERO; 0);
descuento; REDONDEAR(valor*tasa; 2);
neto; valor - descuento;
neto
)
Rellena F2:F8 y la columna queda así:
| Pedido | Unidades | Precio | Valor pedido | Tramo | Descuento | Neto |
|---|---|---|---|---|---|---|
| SO-1041 | 140 | 18,50 | 2.590,00 | 8% | 207,20 | 2.382,80 |
| SO-1042 | 12 | 240,00 | 2.880,00 | 8% | 230,40 | 2.649,60 |
| SO-1043 | 6 | 415,00 | 2.490,00 | 4% | 99,60 | 2.390,40 |
| SO-1044 | 320 | 15,75 | 5.040,00 | 12% | 604,80 | 4.435,20 |
| SO-1045 | 48 | 20,00 | 960,00 | 0% | 0,00 | 960,00 |
| SO-1046 | 200 | 27,30 | 5.460,00 | 12% | 655,20 | 4.804,80 |
| SO-1047 | 76 | 33,25 | 2.527,00 | 8% | 202,16 | 2.324,84 |
| 21.947,00 | 1.999,36 | 19.947,64 |
Tres detalles de esa fórmula son intencionados y ninguno va de LET.
REDONDEAR está sobre el descuento, no sobre el neto. Redondea el neto en su lugar y descuento más neto deja de sumar el valor del pedido por un céntimo aquí y allá, que es justo el tipo de cosa por la que un sistema financiero rechaza un fichero. Redondea el número que sale de una multiplicación, y luego resta.
SI.CONJUNTO termina en VERDADERO; 0. Sin eso, un pedido por debajo de 1.000 devuelve #N/D en vez de un descuento de cero, porque SI.CONJUNTO no tiene rama "si no" propia.
El último argumento es simplemente neto. Podría haber sido valor - descuento directamente y ahorrar una línea. Ponerle nombre igualmente hace que la última línea de la fórmula se lea como el encabezado de la columna y — sección 6 — te da la edición de una sola palabra que convierte esta fórmula en su propio depurador.
4) Nombres Que Excel Acepta y Nombres Que No
Los nombres de LET siguen las mismas reglas que los nombres definidos, y las reglas son más estrictas de lo que la gente espera.
| Regla | Vale | Rechazado |
|---|---|---|
| Debe empezar por letra o guion bajo | tasa, _tmp | 2aTasa |
| Sin espacios | precio_unit, precioUnit | precio unit |
| No puede parecer una dirección de celda | val, cant1 | A1, AB12, F1C1 |
R y C solas están reservadas | Fil, Col | R, C |
| Solo letras, dígitos, guiones bajos y puntos | valor.neto | valor-neto, neto% |
Los nombres no distinguen mayúsculas: Tasa y tasa son el mismo nombre, y declarar los dos es un error, no dos variables. Excel conserva las mayúsculas que escribiste y no las normaliza, así que una fórmula puede parecer que tiene dos nombres cuando tiene uno.
Y luego la trampa que no tiene ningún mensaje de error. Un nombre de LET tapa a un nombre definido del libro que se llame igual, solo dentro de esa fórmula. Si Tasa es un nombre definido que apunta a Configuración!$B$4 y escribes LET(tasa; 0,08; ...), cada tasa de esa fórmula vale 0,08 y la configuración se ignora — en silencio, correctamente, y exactamente como está diseñado. Es una buena característica y una mala sorpresa. La costumbre que lo evita: llama a tus valores de LET por lo que son en esta fórmula (valor, tasa, neto), y deja los nombres de libro con una forma que no reescribirías por casualidad (Tasa_IVA_General, cfg.CorteEnvio).
Los nombres largos tampoco son una virtud. Dentro de una fórmula de cinco líneas, v es demasiado corto para ayudar y valor_del_pedido_antes_de_descuento empuja la línea más allá de donde nadie la lee. Los nombres de la sección 3 tienen la longitud que funciona: una palabra, en minúsculas, la que dirías en voz alta.
5) Nombres Que Se Apoyan en Nombres
La regla de izquierda a derecha no es una limitación que haya que sortear. Es la gracia — significa que un LET se lee de arriba abajo como los pasos del cálculo, y que cada paso puede apoyarse en el anterior.
🎯 Escenario: Ventas quiere también la comisión. Es el 3% del valor neto, pero nunca menos de 25 por pedido, y nunca más de 250.
=LET(
valor; D2*E2;
tasa; SI.CONJUNTO(valor>=5000; 0,12; valor>=2500; 0,08; valor>=1000; 0,04; VERDADERO; 0);
descuento; REDONDEAR(valor*tasa; 2);
neto; valor - descuento;
bruta; neto * 0,03;
comision; MEDIANA(25; bruta; 250);
neto - comision
)
Seis nombres, cada uno construido sobre los de arriba, y todo sigue siendo una celda. Fila 2: neto 2.382,80, comisión bruta 71,4840, ni suelo ni techo aplicados, así que la celda guarda 2.311,316 y muestra 2.311,32. Fila 6 (SO-1045, el pedido de 960): neto 960,00, comisión bruta 28,80, otra vez holgadamente dentro de la banda.
MEDIANA(25; bruta; 250) es el truco de la pinza y merece la pena robarlo: el valor central de suelo, valor, techo es el valor encajado dentro de la banda, sin un solo SI. MAX(25; MIN(250; bruta)) hace lo mismo y se lee peor.
Dos cosas que te da esta forma más allá de la legibilidad.
Una regla que cambia tiene un solo sitio. ¿La comisión pasa al 3,5%? Un número, una línea, y nada más en la fórmula se entera ni le importa. Compáralo con la versión de una sola expresión, donde neto está escrito dos veces — una para la comisión y otra para la resta — y una edición descuidada cambia solo una de ellas.
Los pasos son el rastro de auditoría. Cuando alguien pregunte en una reunión por qué SO-1047 salió a 2.324,84, la fórmula responde en orden: valor del pedido 2.527,00, tramo del 8% porque superó los 2.500, descuento 202,16, neto 2.324,84. Esa es la conversación entera, y está dentro de la celda.
6) LET Como Su Propio Depurador
El motivo de ponerle nombre al último paso en vez de incrustarlo: cambia el argumento final por cualquier nombre y la fórmula devuelve el valor de ese nombre.
=LET(valor; D2*E2; tasa; SI.CONJUNTO(...); descuento; REDONDEAR(valor*tasa;2); neto; valor-descuento; tasa)
Eso devuelve 0,08. Vuelve a poner neto y tienes otra vez tu fórmula. Una palabra, al final, y la celda te enseña el intermedio que quieras — sin columna auxiliar, sin F9, y sin riesgo de evaluar media fórmula y pulsar Intro sin querer.
Las otras tres herramientas, y cuándo gana cada una:
| Herramienta | Cómo | Buena para |
|---|---|---|
Seleccionar + F9 | resalta un trozo de la fórmula en la barra, pulsa F9, pulsa Esc | cualquier fórmula, también las que no llevan LET |
| Fórmulas → Evaluar fórmula | recorre el cálculo entero paso a paso | ver en qué orden pasan las cosas |
El cambiazo de LET | sustituye el último argumento por un nombre | leer un paso con nombre tal y como lo calculó la fórmula |
F9 se merece su aviso. Sustituye el texto resaltado por su valor en la barra de fórmulas, y pulsar Intro confirma eso — convirtiendo para siempre una subexpresión viva en un número escrito a mano. Esc lo deshace; Intro no. En toda hoja de cálculo hay al menos una constante que llegó así.
El cambiazo de LET tiene una ventaja concreta sobre las otras dos: enseña el valor del nombre tal como lo usa esta fórmula, incluido el tapado de la sección 4. Si un nombre del libro está siendo sustituido, F9 sobre un fragmento puede enseñarte lo que no es mientras el cambiazo te enseña la verdad.
7) Qué Te Compra de Verdad el "Se Calcula una Vez"
Cada nombre de un LET se evalúa una sola vez, aparezca las veces que aparezca. Las consecuencias van en dos direcciones.
Velocidad, a veces. Coge una columna de 20.000 filas cuya fórmula hace tres veces el mismo COINCIDIR. Como una sola expresión son 60.000 búsquedas por recálculo; envuelta en un LET son 20.000. En una hoja grande esa es la diferencia entre una pausa y un café.
La advertencia honesta: el motor de cálculo de Excel ya reconoce y guarda algunas subexpresiones repetidas, así que la mejora rara vez es el 3× limpio que sugiere la aritmética, y en rangos pequeños ni se mide. Reescribe por legibilidad, quédate la velocidad como propina, y mide antes de decirle un número a nadie. Si un libro va lento de verdad, la causa es mucho más probable que sean referencias a columnas enteras, funciones volátiles, o una matriz 400 veces más grande que los datos que contiene.
Semántica, siempre. Esta no es una optimización, es un cambio de significado:
=ALEATORIO() & " / " & ALEATORIO() → 0,4712... / 0,9033... dos números distintos
=LET(r; ALEATORIO(); r & " / " & r) → 0,4712... / 0,4712... un número, dos veces
Las dos hacen exactamente lo que dicen. AHORA(), HOY(), ALEATORIO.ENTRE(), DESREF() e INDIRECTO() se comportan igual dentro de un LET — nombradas una vez, muestreadas una vez. Normalmente eso es lo que querías y no sabías pedir: una fórmula que estampa la misma marca de tiempo en tres sitios, o que saca un único valor al azar y lo usa de forma coherente. De vez en cuando elimina en silencio una variación de la que dependías, y una hoja de muestreo que de pronto devuelve valores idénticos a lo largo de una fila es el síntoma.
8) LAMBDA: Cuando la Fórmula Debería Recibir Argumentos
LET pone nombre a valores dentro de una fórmula. El siguiente problema es una fórmula que quieres en muchos sitios: la escalera de descuentos de la sección 3 es una regla de negocio, y ahora mismo vive en siete celdas de esta hoja y probablemente en once de otras tres. Cambia los tramos y te toca ir de caza.
LAMBDA convierte esa regla en una función.
=LAMBDA(parámetro1; [parámetro2]; ...; cálculo)
Los parámetros primero, el cálculo al final — la misma forma que LET, salvo que los nombres reciben su valor de quien la llame en lugar de de la propia fórmula.
Escribe una directamente en una celda y Excel devuelve #¡CALC!. No es un fallo: has definido una función y no la has llamado nunca, y #¡CALC! es Excel diciéndolo. De ahí sale el truco que hace que LAMBDA se pueda aprender — llámala en el sitio poniendo los argumentos entre paréntesis detrás:
=LAMBDA(valor; SI.CONJUNTO(valor>=5000; 0,12; valor>=2500; 0,08; valor>=1000; 0,04; VERDADERO; 0))(2527)
Resultado: 0,08. El (2527) del final es la llamada. Prueba así todas tus LAMBDA, en una celda de usar y tirar, con los valores incómodos — 2.499 y 2.500 y 999 — antes de ponerles nombre. Una LAMBDA equivocada en una celda es una errata; una LAMBDA equivocada en el Administrador de nombres está equivocada en cuarenta sitios a la vez.
9) Ponerle Nombre: Cuatro Campos y un Consejo Emergente
Fórmulas → Asignar nombre, o Ctrl+F3 para el Administrador de nombres completo.
| Campo | Qué poner | Por qué importa |
|---|---|---|
| Nombre | TasaDescuento | es lo que vas a escribir en las celdas; se aplican las reglas de la sección 4 |
| Ámbito | Libro | el ámbito de hoja significa #¿NOMBRE? en todas las demás hojas — el error más común de todos aquí |
| Comentario | "Tasa de descuento por tramos para un valor de pedido. 4% / 8% / 12%." | sale como consejo emergente cuando alguien escribe =TasaDescuento( |
| Se refiere a | =LAMBDA(valor; SI.CONJUNTO(valor>=5000; 0,12; valor>=2500; 0,08; valor>=1000; 0,04; VERDADERO; 0)) | pega la fórmula ya probada, menos el (2527) del final |
Ahora =TasaDescuento(D2*E2) funciona en cualquier punto del libro, se autocompleta en la barra de fórmulas, y enseña tu comentario mientras lo hace. Hay una sola edición para toda la regla de negocio y está en un cuadro de diálogo con una descripción al lado — que es más documentación de la que tienen la mayoría de los libros en ninguna parte.
El campo Comentario es el que se salta todo el mundo. Es el único sitio de Excel donde una función personalizada puede explicarse a la siguiente persona, cuesta una frase, y sin él tu compañero ve un nombre de función que no ha oído en su vida y ninguna manera de averiguar qué quiere.
Construye la segunda encima de la primera, porque una LAMBDA puede llamar a otra LAMBDA y puede usar LET por dentro:
ValorNeto =LAMBDA(unidades; precio;
LET(valor; unidades*precio;
descuento; REDONDEAR(valor * TasaDescuento(valor); 2);
valor - descuento))
Y F2 pasa a ser =ValorNeto(D2; E2). La fila 2 devuelve 2.382,80, exactamente igual que antes — pero ahora la hoja dice lo que está haciendo, y las tres celdas que necesitan la tasa en vez del neto pueden seguir sacándola de TasaDescuento sin duplicar la escalera.
Una nota práctica sobre la edición: el cuadro "Se refiere a" del Administrador de nombres se comporta como una barra de fórmulas, lo que significa que las flechas empiezan a insertar referencias de celda en vez de mover el cursor. Pulsa F2 para pasar ese cuadro a modo edición primero. Es una tontería que hace que la gente abandone el Administrador de nombres por completo.
10) Los Cuatro Errores, y Qué Significa Cada Uno
LAMBDA falla de pocas maneras y cada error es lo bastante concreto como para diagnosticarlo desde la celda.
| Error | Causa | Arreglo |
|---|---|---|
#¡CALC! | una LAMBDA a la que nunca se llama | añade (argumentos) detrás, o llévala al Administrador de nombres |
#¿NOMBRE? | el nombre no está definido en este libro, o tiene ámbito de hoja y estás en otra, o está mal escrito | mira el Ámbito en el Administrador de nombres — sección 13 |
#¡VALOR! | número equivocado de argumentos | cuenta los parámetros; las funciones de dos parámetros llamadas con uno son lo habitual |
#¡NUM! | una recursión que no terminó, o que fue demasiado profunda | arregla el caso base — sección 11 |
El que de verdad confunde es #¡VALOR!, porque Excel no te dice qué función recibió mal la cuenta, y una llamada anidada tres niveles más abajo se reporta arriba del todo. Cuando una LAMBDA que funcionaba empieza a devolver #¡VALOR! después de una edición, lo primero que hay que mirar es si añadiste un parámetro a la definición y dejaste las llamadas como estaban.
Los parámetros opcionales existen, y necesitan ISOMITTED para servir de algo:
ValorNeto =LAMBDA(unidades; precio; [decimales];
LET(dec; SI(ISOMITTED(decimales); 2; decimales);
valor; unidades*precio;
valor - REDONDEAR(valor * TasaDescuento(valor); dec)))
Los corchetes en la lista de parámetros lo marcan como opcional; ISOMITTED comprueba si quien llama lo pasó. Sin ISOMITTED un parámetro omitido llega como un valor de error y envenena el cálculo entero, que es una forma confusa de enterarte de que lo necesitabas.
11) Los Ayudantes: Una Fórmula Para una Columna Entera
Una LAMBDA con nombre ya es útil por sí sola. Se convierte en otra cosa cuando se la entregas a una función que la aplica repetidamente — los seis ayudantes que llegaron con ella.
| Función | Qué hace | Forma de la respuesta |
|---|---|---|
MAP | aplica una LAMBDA a cada elemento de una o varias matrices | la misma forma que la entrada |
BYROW | la aplica a cada fila, como fila | una columna |
BYCOL | la aplica a cada columna | una fila |
SCAN | como REDUCE, pero guarda todos los intermedios | la misma forma que la entrada |
REDUCE | pliega una matriz hasta un único valor | una celda |
MAKEARRAY | construye una matriz a partir de sus índices de fila y columna | lo que le pidas |
La columna de valor neto entera, como una sola fórmula en F2, derramando siete filas:
=MAP(D2:D8; E2:E8; LAMBDA(u; p; ValorNeto(u; p)))
Resultado: de 2.382,80 hasta 2.324,84 — los mismos siete números de la sección 3, desde una única celda, sin un rellenado hacia abajo que se pueda desalinear y sin media columna vacía cuando alguien añada la fila 9. Apúntala a una columna de Tabla en vez de a D2:D8 y el rango crece solo.
El total general, sin ninguna columna auxiliar:
=SUMA(MAP(D2:D8; E2:E8; LAMBDA(u; p; ValorNeto(u; p))))
Resultado: 19.947,64.
SCAN se gana el sitio en los totales acumulados, que son el motivo clásico por el que la gente escribe $B$2:B2 y luego descubre que se rompe al ordenar la tabla:
=SCAN(0; F2:F8; LAMBDA(acum; v; acum + v))
Resultado: 2.382,80 / 5.032,40 / 7.422,80 / 11.858,00 / 12.818,00 / 17.622,80 / 19.947,64.
Dos precauciones antes de convertirlo todo. Una columna derramada no se puede editar fila a fila, así que el único pedido que necesita un ajuste manual ahora necesita una regla — lo cual suele ser una mejora y de vez en cuando una pelea. Y MAP sobre decenas de miles de filas es más lento que la misma lógica rellenada hacia abajo, a veces bastante, porque cada elemento es una llamada aparte en lugar de una pasada vectorizada. La elegancia es real; el coste también.
12) Recursión, Poca y Con Cuidado
Una LAMBDA con nombre puede llamarse a sí misma. Esta es la capacidad que la convierte en un lenguaje de programación de verdad y no en una macro, y también la que te va a bloquear el libro si te descuidas.
La regla de toda función recursiva es la misma: el caso base va primero, y tiene que ser alcanzable.
SoloDigitos =LAMBDA(texto;
SI(LARGO(texto)=0; "";
LET(primero; IZQUIERDA(texto; 1);
resto; EXTRAE(texto; 2; LARGO(texto));
SI(ESNUMERO(primero*1); primero; "") & SoloDigitos(resto))))
=SoloDigitos("SO-1041") devuelve 1041. Coge el primer carácter, lo conserva si es un dígito, y se pasa el resto de la cadena a sí misma — y para porque resto es más corto cada vez y la cadena vacía devuelve de inmediato.
Borra la línea LARGO(texto)=0 y la misma función se llama a sí misma para siempre. Excel no tiene un mensaje amable para esto: sale #¡NUM! si hay suerte, y una congelación larga con un pico de memoria si no la hay. Prueba las funciones recursivas primero con entradas cortas, y guarda antes de probar.
La profundidad de recursión es finita y más baja de lo que la gente espera — unos pocos miles de niveles, según lo que la función cargue consigo, y cada nivel cuesta memoria. Para cualquier cosa con una forma conocida, REDUCE o SCAN es más rápido y no se puede desbocar. Guarda la recursión para problemas realmente sin límite: recorrer una cadena de longitud desconocida, una jerarquía de profundidad desconocida, una iteración que para cuando se alcanza una tolerancia.
Y comprueba si tu versión te ha adelantado antes de escribir una de estas. SoloDigitos es un buen ejemplo didáctico y una mala respuesta en una versión moderna de 365, donde =REGEXEXTRACT("SO-1041"; "\d+") hace lo mismo en una sola llamada. La recursión es una herramienta para problemas que Excel no cubre con ninguna función — y esa lista se acorta cada año.
13) Dónde Vive una LAMBDA, y Cómo se Pierde
Esta es la parte que decide si tus funciones personalizadas sobreviven al contacto con tus compañeros.
Una LAMBDA con nombre se guarda en los nombres definidos del libro. No se guarda en la fórmula que la llama, ni en tu instalación de Excel, ni en tu cuenta. De ahí salen tres fallos que conviene conocer antes de que pasen:
- Copia una celda a otro libro y la fórmula llega sin la función.
=ValorNeto(D2;E2)se convierte en#¿NOMBRE?al otro lado, y no hay nada en la celda que le diga a quien la recibe qué le falta. - Copia la hoja entera y los nombres se van con ella, porque las copias de hoja arrastran sus dependencias. Es la forma más barata de mover funciones personalizadas entre libros y casi nadie la conoce.
- Manda el fichero a un Excel 2019 y cada
LETy cadaLAMBDAaparecen como_xlfn.LETy_xlfn.LAMBDAcon#¿NOMBRE?en la celda. La fórmula se conserva perfectamente y no puede ejecutarse. Si el fichero tiene que abrirse en versiones antiguas, esto no es un problema de formato que puedas maquillar — el cálculo ya no está.
No hay biblioteca integrada, ni importación, ni historial de versiones para los nombres definidos. Dos costumbres cubren casi todo el riesgo. Guarda en el libro una hoja sencilla que liste cada función personalizada, sus argumentos y un ejemplo resuelto — el Administrador de nombres guarda la definición pero la enseña en un cuadro de tres líneas de alto, y el campo de comentario no sobrevive a una lectura con prisa. Y si vas a construir más de un puñado, instala Excel Labs desde la tienda de complementos: su Advanced Formula Environment te da un editor de verdad, con saltos de línea, sangría y comentarios que persisten, en lugar de un cuadro de diálogo.
Y conviene decir claramente lo de fondo. Una LAMBDA es código, en un sitio sin control de versiones, sin pruebas y sin revisión. Eso no es motivo para evitarla — una regla de negocio escrita una vez y con nombre es más segura que la misma regla pegada en cuarenta celdas. Es motivo para tratar el libro que guarda tus funciones como algo más que una hoja de cálculo.
14) El Escalón Por el Que Nadie Preguntó
Una última cosa sobre la escalera de la sección 3, porque es de esas que solo se ven cuando la fórmula es legible como para poder pensarla.
Los tramos saltan. Un pedido de 2.499 lleva el 4% y deja 2.399,04 netos. Un pedido de 2.500 lleva el 8% y deja 2.300,00. El pedido más grande vale 99,04 menos para ti, y sigue siendo peor hasta que el pedido llega a 2.607,65, donde el 8% de un número mayor por fin alcanza al otro.
SO-1043 y SO-1047 de la tabla están uno a cada lado de esa línea: 2.490 deja 2.390,40 netos, y 2.527 — treinta y siete de negocio extra — deja 2.324,84. Sesenta y cinco y medio menos, por vender más.
LET no causó eso y no puede arreglarlo. El arreglo es una escalera marginal, donde cada tasa se aplica solo al trozo por encima de su umbral, igual que funciona el IRPF:
=LET(
v; D2*E2;
d; MEDIANA(v-1000; 0; 1500)*0,04
+ MEDIANA(v-2500; 0; 2500)*0,08
+ MAX(v-5000; 0)*0,12;
v - REDONDEAR(d; 2)
)
Cada MEDIANA es un trozo encajado en su propia banda, y el escalón desaparece: 2.499 deja 2.439,04, 2.500 deja 2.440,00, y ningún pedido vale nunca menos que otro más pequeño.
Que es exactamente el tipo de fórmula que sería ilegible sin un nombre delante, y es la razón de que este artículo termine aquí y no en los tramos. La gracia de poner nombre a las cosas no es el orden. Es que una fórmula que puedes leer es una fórmula cuya lógica de negocio puedes discutir — y el escalón llevaba dos años en esa hoja mientras todo el mundo estaba ocupado contando paréntesis.
15) Mini Ejercicios
Copia la cuadrícula en una hoja en blanco empezando en A1. Cada respuesta es una fórmula o un cuadro de diálogo.
- Ponle nombre a la repetición. Escribe el
LETde la sección 3 enF2y rellena hastaF8. Después di cuántas veces apareceD2*E2en tu fórmula, y cuántas aparecía en la versión del principio del artículo. - Rómpela a propósito. Borra el
netofinal de tu fórmula para que el número de argumentos quede par. Anota exactamente qué hace Excel, y por qué un número par siempre es un error. - Depurar por cambiazo. Sin añadir ni una celda, haz que
F2enseñe la tasa de descuento que usó, después el importe del descuento, y después déjalo como estaba. Di qué palabra cambiaste cada vez. - El orden importa. Reescribe la fórmula con
tasadeclarada antes quevalory describe qué pasa. Después explica la regla en una frase. - Ponle pinza. Añade la comisión de la sección 5 e informa de la cifra tras comisión de
SO-1044ySO-1045. Di si alguna de las dos toca el suelo o el techo, y después da el mayor valor de pedido que sí tocaría el suelo de 25. - Conviértela en función. Define
TasaDescuentoen el Administrador de nombres con ámbito de libro y un comentario. Pruébala en 999, 1.000, 2.499, 2.500 y 5.000 antes de usarla en ningún sitio, y di cuáles tres de esos cinco habrías fallado con>en vez de>=. - Una celda, siete respuestas. Sustituye
F2:F8por un únicoMAPsobreD2:D8yE2:E8. Después añade un octavo pedido en la fila 9 y di qué tienes que hacer para incluirlo — y qué habrías tenido que hacer con una columna rellenada hacia abajo. - El escalón. Calcula el valor neto de un pedido de exactamente 2.499 y de otro de exactamente 2.500 con la escalera de la sección 3. Después haz los dos otra vez con la escalera marginal de la sección 14, y di en una línea cuál de las dos versiones defenderías delante de un cliente.
Resumen
LET pone nombre a valores dentro de una fórmula: parejas de nombre y valor, después el cálculo, siempre un número impar de argumentos, cada nombre evaluado una sola vez y visible solo para los nombres que vienen después. Arregla la repetición y la falta de nombres a la vez, porque eran el mismo problema.
LAMBDA le da parámetros a una fórmula, que es lo que la convierte en función. Pruébala en una celda con (argumentos) al final, después llévala al Administrador de nombres con ámbito de libro y un comentario, y pásasela a MAP, BYROW, SCAN o REDUCE cuando quieras aplicarla a un rango entero desde una sola celda.
Los detalles que más tiempo ahorran: un número par de argumentos significa que falta el cálculo final; un nombre de LET tapa en silencio a un nombre del libro que se llame igual; cambiar el último argumento por un nombre convierte cualquier LET en su propio depurador; #¡CALC! significa una LAMBDA sin llamar y #¡VALOR! significa el número equivocado de argumentos; y una función personalizada vive en ese libro — copia la hoja, no la celda.
Y el rendimiento real de todo esto es la sección 14. La fórmula del principio de este artículo fue correcta durante dos años, y nadie podía ver que la regla que implementaba le costaba dinero al negocio en cada pedido justo por encima de 2.500. Las fórmulas que puedes leer son fórmulas que puedes cuestionar. Eso vale más que los paréntesis que te ahorras.
