Repetir valores N veces: tres enfoques con REDUCE, SCAN y ARCHIVOMAKEARRAY
Joan Recasens plantea un problema clásico: tiene una lista de categorías (A, B, C) con el número de repeticiones de cada una (4, 2, 3) y quiere generar la secuencia expandida (A A A A B B C C C) en celdas individuales.
Tres miembros aportan soluciones usando tres LAMBDAs de orden superior distintas:
Leo con REDUCE — acumula los valores iterando sobre las categorías:
``
=LET(
a; A2:A4;
b; B2:B4;
EXCLUIR(
REDUCE(""; SECUENCIA(FILAS(a));
LAMBDA(x;y; APILARV(x; SI(SECUENCIA(INDICE(b;y)); INDICE(a;y))))
);
1
)
)
`
Para repetir un valor en n filas, SI(SECUENCIA(n); valor): SECUENCIA(n) fabrica n números distintos de cero y SI devuelve el valor una vez por cada uno.
Nacho con SCAN — usa la suma acumulada como índice inverso:
`
=LET(
a; SCAN(0; B2:B4; LAMBDA(a;b; a+b));
BUSCARX(SECUENCIA(MAX(a)); a; A2:A4;; 1)
)
`
La idea es que SCAN genera la suma acumulada (4, 6, 9) y luego BUSCARX con modo de coincidencia 1 (siguiente mayor o igual) mapea cada número del 1 al 9 a su categoría correspondiente.
Andrés con ARCHIVOMAKEARRAY — construye una matriz y la aplana:
`
=LET(
cats; A2:A4;
nums; B2:B4;
ENCOL(
ARCHIVOMAKEARRAY(FILAS(cats); MAX(nums);
LAMBDA(f;c; SI(c<=INDICE(nums;f); INDICE(cats;f); NOD()))
);
2
)
)
`
Los huecos que sobran se marcan con NOD(), y ENCOL(...; 2) los tira al aplanar.
Leo también aporta una alternativa sin LAMBDA usando MMULT para la suma acumulada:
`
=LET(
a; A2:A4;
b; B2:B4;
f; FILAS(a);
s; SECUENCIA(f);
BUSCARX(SECUENCIA(SUMA(b)); MMULT(N(s>=ENFILA(s)); b); a;; 1)
)
`
Esta técnica de multiplicar una matriz triangular inferior (N(s>=ENFILA(s))) por el vector de valores consigue el efecto de SCAN sin usar LAMBDA: cada fila de la matriz marca qué valores entran en esa suma acumulada.
Si lo que molesta es escribir la LAMBDA, hay otra salida, que es la que se llama ETA LAMBDA: pasarle a SCAN la función por su nombre. SCAN(0; B2:B4; SUMA) da la misma suma acumulada (4, 6, 9) que SCAN(0; B2:B4; LAMBDA(a;b; a+b)).
Nota (corregido el 26/9/2026): dos fórmulas del hilo no daban la secuencia. La de REDUCE repetía con REPETIR, que concatena el texto en una sola celda (AAAA, BB, CCC) en vez de generar filas. La de ARCHIVOMAKEARRAY rellenaba los huecos con "" y aplanaba con ENCOL(...; 3), y salían 12 filas con tres vacías en medio: ENCOL tira las celdas vacías, pero "" es un texto. Las dos de arriba están corregidas y comprobadas en Excel. Y la ficha llamaba «ETA LAMBDA» al truco de MMULT`: son dos cosas distintas, y la ETA LAMBDA es pasar la función por su nombre.
El problema
Joan Recasens plantea un clásico: tiene una lista de categorías (A, B, C) con cuántas veces se repite cada una (4, 2, 3) y quiere generar la secuencia expandida —A A A A B B C C C— en celdas individuales. Tres miembros lo resolvieron con tres funciones de orden superior distintas, y hay hasta una versión sin LAMBDA.
Enfoque 1: REDUCE (Leo)
La lectura más natural: recorrer las categorías una a una y acumular las repeticiones. REDUCE itera sobre las filas y en cada paso apila con APILARV la categoría repetida tantas veces como toque, con SI(SECUENCIA(veces); categoría): SECUENCIA fabrica tantos números como repeticiones y SI devuelve la categoría una vez por cada uno. EXCLUIR(...;1) quita la fila semilla inicial.
=LET(
a; A2:A4;
b; B2:B4;
EXCLUIR(
REDUCE(""; SECUENCIA(FILAS(a));
LAMBDA(x;y; APILARV(x; SI(SECUENCIA(INDICE(b;y)); INDICE(a;y))))
);
1
)
)Ojo con REPETIR, que es la tentación: REPETIR("A"; 4) devuelve AAAA en una sola celda. Concatena; no genera filas.
Enfoque 2: SCAN + BUSCARX (Nacho)
Un giro más ingenioso: usar la suma acumulada como índice. SCAN convierte las cantidades (4, 2, 3) en acumulados (4, 6, 9). Después, para cada número del 1 al 9, un BUSCARX en modo de coincidencia "siguiente mayor o igual" (el 1 del último argumento) devuelve la categoría que corresponde a ese tramo:
=LET(
a; SCAN(0; B2:B4; LAMBDA(a;b; a+b));
BUSCARX(SECUENCIA(MAX(a)); a; A2:A4;; 1)
)Elegante porque evita apilar: mapea posiciones a categorías de un tirón.
Enfoque 3: ARCHIVOMAKEARRAY (Andrés)
Andrés construye una matriz rectangular de "categorías por número máximo de repeticiones" y la rellena: cada celda muestra la categoría si su columna no supera las repeticiones de esa fila, y un NOD() en caso contrario. Luego ENCOL(...; 2) aplana la matriz y descarta esos errores. Tiene que ser un error y no un texto vacío: ENCOL tira las celdas vacías, pero "" es un texto, y con él salen doce filas en vez de nueve. Es el enfoque más visual: primero dibujas la rejilla, luego la aplanas.
Bonus: la suma acumulada sin LAMBDA
Leo remata con una joya. Se puede reproducir el efecto de SCAN sin usar LAMBDA, multiplicando una matriz triangular inferior por el vector de cantidades con MMULT:
=LET(
a; A2:A4;
b; B2:B4;
s; SECUENCIA(FILAS(a));
BUSCARX(SECUENCIA(SUMA(b)); MMULT(N(s>=ENFILA(s)); b); a;; 1)
)Esta técnica —matriz triangular por vector para obtener acumulados— da el resultado de SCAN sin escribir una LAMBDA. No hay que confundirla con la ETA LAMBDA, que es otra forma de ahorrarse la LAMBDA: pasarle a SCAN la función por su nombre. SCAN(0; B2:B4; SUMA) da la misma suma acumulada.
Funciones clave
REDUCEySCAN: dos formas de iterar; una acumula apilando, la otra genera sumas acumuladas.SIconSECUENCIA: repite un valor en tantas filas como indique la cantidad (REPETIRno sirve: lo repite dentro de una sola celda).BUSCARXcon coincidencia aproximada: mapea cada posición a su categoría por tramos.ARCHIVOMAKEARRAYyENCOL: construyen una rejilla y la aplanan.MMULTyN: reproducen la suma acumulada sinLAMBDA.
Conclusión
Un mismo objetivo —expandir una lista según sus repeticiones— resuelto por acumulación (REDUCE), por índice acumulado (SCAN + BUSCARX), por rejilla (ARCHIVOMAKEARRAY) e incluso sin LAMBDA (MMULT). Cada enfoque enseña una técnica reutilizable en decenas de problemas distintos. Así funciona la comunidad de Influexcel: una pregunta corta, cuatro respuestas que valen por un curso.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Cálculos iterativos con REDUCE y APILARV en Excel CasoLa comunidad aborda un caso sobre cómo trabajar con bucles iterativos en Excel usando funciones modernas. Un miembro necesita realizar cálcu
- Distribución equitativa con LAMBDA, REDUCE y ALEATORIO CasoHéctor plantea la necesidad de repartir un conjunto de líneas (tareas, actividades) entre varios grupos de forma equitativa y aleatoria. Ide
- Media móvil dinámica: 6 enfoques con SCAN, MMULT y MAP CasoUn miembro de la comunidad tiene un rango con ventas mensuales y necesita generar una columna con la media móvil de los últimos 3 meses usan
- Error #CALC! con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- IMPORTTEXT: importar múltiples CSV con LAMBDA recursiva y exploración profunda CasoCaso doble que combina la resolución de un problema práctico con una exploración exhaustiva de las nuevas funciones IMPORTTEXT e IMPORTCSV d
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- BUSCARX explicado fácil TutorialDesde la sintaxis básica hasta trucos avanzados como expresiones regulares y cruce de rangos. Además, aprenderás a manejar errores y a usar
- Filtrar columnas que contienen negativos con BYCOL y N() CasoJuan plantea cómo detectar valores negativos en una matriz numérica. Conoce HALLAR para buscar texto, pero no encuentra el equivalente para
- Gráficos que se actualizan solos en Excel: orden, etiquetas condicionales y rangos dinámicos TutorialTres problemas que aparecen en cuanto un gráfico deja de leer una tabla fija y pasa a leer el resultado de un cálculo. Salieron montando el