Convertir información de tabla horizontal en tabla vertical con fórmulas

Tengo varias filas de datos para diferentes usuarios. Algunos usuarios tienen múltiples entradas y otros solo tendrán una. Toda esta información se almacena en un formato de '1 fila por usuario'. Mi objetivo es mostrar toda esta información de forma vertical, con cada usuario teniendo potencialmente múltiples líneas en función de la cantidad de parámetros que pasan.

Aquí hay una mejor representación visual.¿Cuál es la mejor manera de hacer esto? Idealmente, me gustaría configurarlo donde pueda simplemente pegar nuevas filas de entrada de usuario en la parte inferior y hacer que la tabla vertical se vuelva a llenar.

estoy usando O365

Answer

Esta fórmula funciona para Excel 2019 y versiones posteriores

En la fórmula de matriz de celdas I2(CSE) copiada a la derecha K2y todo copiado hacia abajo:

  =IFERROR(FILTERXML("<a><b>"&SUBSTITUTE(TEXTJOIN(" ",,IF(ISNUMBER($B$2:$G$4),$A$2:$A$4&" "&$B$2:$G$4,"")&IF(ISTEXT($B$2:$G$4),$B$2:$G$4,""))," ","</b><b>")&"</b></a>","//b["&(ROW($A1)*3+COLUMN(A$1))-3&"]"),"")

Observación: en Office 365, creo que es una entrada normal.

ingrese la descripción de la imagen aquí

Aquí hay una versión modificada de la respuesta en esta publicación:

=LET( upValues, B2:G5, upFields, {"ID","Color"},
      byBody, A2:A5,  byHdr, A1,

       blockSize, COLUMNS( upFields ),
       byC, COLUMNS( byBody ), upC, COLUMNS( upValues ),
       dmxR, MIN( ROWS( upValues ), ROWS( byBody ) ),
       upCells, dmxR * upC/blockSize,
       tCSeq, SEQUENCE( 1, byC + blockSize ),  tRSeq, SEQUENCE( upCells + 1,, 0 ),  upSeq, SEQUENCE( upCells,, 0 ),

       hdr, IF( tCSeq <= byC,  INDEX( byHdr, , tCSeq ),
                               INDEX( upFields, 1, tCSeq - byC - 0 ) ),
       muxBody, INDEX( byBody, SEQUENCE( upCells, byC, 0 )/byC/upC*blockSize + 1, SEQUENCE( 1, byC ) ),
       muxValues, INDEX( upValues, SEQUENCE( upCells, blockSize, 0 )/upC+1, MOD(SEQUENCE( upCells, blockSize, 0 ),upC)+1),

       table, IF( tCSeq <= byC, muxBody,
                                INDEX( muxValues, upSeq + 1, tCSeq - byC ) ),
       ftable, FILTER( table, INDEX( table, , 2 ) <> 0 ),
       fRSeq, SEQUENCE( ROWS( ftable ) + 1,,0 ),

       IF( fRSeq = 0, hdr, INDEX( ftable, fRSeq, tCSeq) )  )

Al des-pivotar, decimos que des-pivotamos rangeX By rangeY. Esta fórmula sigue esa convención.

upValues son los valores que no se pivotarán (B2:G5 en este ejemplo). Esto acepta un rango.

upFields son los encabezados de columna que desea mostrar en su salida (los codifiqué porque ID # - 1, 2, etc. se ignoran esencialmente en su caso) . Esto acepta un rango de filas o una matriz de filas ingresada como se muestra.

byBody es la columna de por valores (Jim, Mike...) . Esto acepta un rango de columnas

byHdr es el encabezado de la(s) columna(s). (El nombre es solo una columna, pero esto acepta un rango de filas)

Como asumo que desea aplicarlo de manera más general, dejé gran parte de la sobrecarga de manejo de errores que estaba en la publicación original.

resultado