Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

468
Vistas
¿Cómo hago que FLATTEN funcione para rangos no contiguos?

Tengo una función FLATTEN LAMBDA que aplana los datos en una matriz. Esto funciona bien, pero quiero integrar otro argumento de matriz para poder usar rangos no contiguos.

En mi ejemplo, el rango A1:B6 está alojado en array y devuelve los datos aplanados.

¿Cómo puedo incluir un argumento array2 que acepte D1:D6 como un rango adicional?

Ejemplo

Fórmula:

 FLATTEN = LAMBDA(array, LET( rows,ROWS(array), columns,COLUMNS(array), sequence,SEQUENCE(rows*columns), quotient,QUOTIENT(sequence-1,columns)+1, mod,MOD(sequence-1,columns)+1, INDEX(IF(array="","",array),quotient,mod) ) )
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Editar 04/07/22 :

ms365 ahora ha introducido una función llamada VSTACK() y TOCOL() que permite la funcionalidad que nos faltaba en FLATTEN() de GS (y funciona aún mejor)

En su caso, la fórmula podría convertirse en:

 =TOCOL(A1:D6,1)

Y esa pequeña fórmula (donde el segundo parámetro le dice a la función que ignore las celdas vacías) reemplazaría todo lo demás desde abajo aquí. Si C1:C6 tuviera valores que no desea incorporar, puede probar cosas como:

 =VSTACK(TOCOL(A1:B6),D1:D6)

Respuesta anterior :

Realmente no puede crear un LAMBDA() con un número desconocido (de antemano) de matrices para incluir en aplanar. El hecho de que tenga matrices de varias columnas contribuirá a la "complicación". Una forma de 'aplanar' varias columnas de esta manera específica sería:

ingrese la descripción de la imagen aquí

Fórmula en G1 :

 =LET(X,CHOOSE({1,2,3},A1:A6,B1:B6,D1:D6),Y,COLUMNS(X),Z,SEQUENCE(COUNTA(X)),INDEX(X,CEILING(Z/Y,1),MOD(Z-1,Y)+1))

EDITAR: según su comentario, puede extender esto como tal:

 =LET(X,CHOOSE({1,2,3},IF(A1:A6="","",A1:A6),IF(B1:B6="","",B1:B6),IF(D1:D6="","",D1:D6)),Y,COLUMNS(X),Z,SEQUENCE(ROWS(X)*Y),FLAT,INDEX(X,CEILING(Z/Y,1),MOD(Z-1,Y)+1),FILTER(FLAT,FLAT<>""))
over 4 years ago · Santiago Trujillo Denunciar

0

Es una trampa, pero:

 FLATTEN = LAMBDA(array, LET( rows,ROWS(array), columns,COLUMNS(array), sequence,SEQUENCE(rows*columns), quotient,QUOTIENT(sequence-1,columns)+1, mod,MOD(sequence-1,columns)+1, unpiv, INDEX(array,quotient,mod), FILTER(unpiv, unpiv<>"") ) )

Donde su matriz se ha extendido a A1: D6 como entrada.

Creo que la respuesta de JvdV será la mejor según el formato de entrada que desee, pero ya había escrito esto, así que aquí va...

Podrías hacerlo:

 =LET( array1, A1:B6, array2, D1:D6, rows1,ROWS(array1), rows2,ROWS(array2), columns1,COLUMNS(array1), columns2,COLUMNS(array2), rows, MIN(rows1, rows2), columns, columns1 + columns2, sequence,SEQUENCE(rows*columns), quotient,QUOTIENT(sequence-1,columns)+1, mod,MOD(sequence-1,columns)+1, IFERROR(INDEX( IF( ISBLANK(array1),"",array1),quotient,mod), INDEX(IF( ISBLANK(array2),"",array2),quotient,MOD(sequence-1,columns2)+1) ) )

Tomará entradas de varias columnas/filas para ambas matrices.

ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo Denunciar

0

A partir del artículo aquí y actualizándolo en función de las observaciones sobre los valores vacíos en las matrices y permitiendo matrices de diferentes tamaños, podemos obtener dos fórmulas que debería poder traducir a funciones Named LAMBDA con nombre para matrices de "apilamiento" y "estantería".

Matrices apiladas

 =LET(rngA, A1:C5, rngB, A9:D11, rowsA, ROWS(rngA), rowsB, ROWS(rngB), NumCols, MAX(COLUMNS(rngA), COLUMNS(rngB)), SeqRow, SEQUENCE(rowsA + rowsB), SeqCol, SEQUENCE(1, NumCols), Result, IF(SeqRow <= rowsA, INDEX(IF(rngA="","",rngA), SeqRow, SeqCol), INDEX(IF(rngB="","",rngB), SeqRow-rowsA, SeqCol)), arr, IFERROR(Result,""), arr)

Arreglos de estantes

 =LET(rngA, A1:C5, rngB, B8:D12, colsA, COLUMNS(rngA), colsB, COLUMNS(rngB), NumRows, MAX(ROWS(rngA), ROWS(rngB)), SeqRow, SEQUENCE(NumRows), SeqCol, SEQUENCE(1, colsA + colsB), Result, IF(SeqCol <= colsA, INDEX(IF(rngA="","",rngA), SeqRow, SeqCol), INDEX(IF(rngB="","",rngB), SeqRow, SeqCol-colsA ) ), arr, IFERROR(Result,""), arr)

Una vez que tenga una matriz contigua, puede aplicar la fórmula que ya tiene:

Actualizado para usar un rango de derrame para facilitar las pruebas...

 =LET(data, A1#, rows, ROWS(data), cols, COLUMNS(data), seq, SEQUENCE(rows*cols,,0), list, INDEX(IF(data="", "", data), QUOTIENT(seq, cols)+1, MOD(seq, cols)+1), FILTER(list, LEN(list)>0))

Este enfoque está realmente orientado hacia las funciones named LAMBDA porque, de lo contrario, terminará con fórmulas monstruosas y los otros enfoques pueden ser mejores en ese caso.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda