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

  • REDUCE y SCAN: dos formas de iterar; una acumula apilando, la otra genera sumas acumuladas.
  • SI con SECUENCIA: repite un valor en tantas filas como indique la cantidad (REPETIR no sirve: lo repite dentro de una sola celda).
  • BUSCARX con coincidencia aproximada: mapea cada posición a su categoría por tramos.
  • ARCHIVOMAKEARRAY y ENCOL: construyen una rejilla y la aplanan.
  • MMULT y N: reproducen la suma acumulada sin LAMBDA.

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