Combine varias columnas dentro de varias filas según el valor de una columna hasta que cambie el valor

Combine varias columnas dentro de varias filas según el valor de una columna hasta que cambie el valor

En referencia a la imagen adjunta con datos de muestra, me gustaría combinar fecha, persona y nota de varias filas en 1 fila con saltos de línea para cada conjunto de valores combinados. Cada nota ocupa una fila con Nombre e ID en blanco, por lo que será necesario combinar cada fila debajo de la fila principal con valores. Consulte la imagen adjunta para conocer los datos y el resultado deseado.

Data de muestra:

+-------+--------------+------------------+---------+-----------------------+
| Name  |      ID      |       Date       | Person  |         Notes         |
+-------+--------------+------------------+---------+-----------------------+
| Danny | UID11224512  | 11/5/2019        | Joe     | <p>Note for Danny</p> |
|       |              | 11/5/2019        | John    | <p>Note 2</p>         |
| Joe   | UID11224956  | 11/5/2019 18:54  | Someone | <p>Note 1</p>         |
|       |              | 11/5/2019 18:54  | Someone | <p>Note 2</p>         |
| Jane  | UID11224959  | 11/5/2019 18:54  | Danny   | <p>Note 1 </p>        |
|       |              | 11/5/2019 17:33  | Shawn   | <p>Note 3</p>         |
|       |              | 11/6/2019 18:54  | Jane    | <p>Note 2</p>         |
| Tom   | UID115466652 |                  |         |                       |
| Eric  | UID168998955 |                  |         |                       |
| Paula | UID166559885 |                  |         |                       |
| Frank | UID112249569 | 11/5/2019 18:54  | Someone | <p>Note 1</p>         |
|       |              | 11/6/2019 18:54  | Someone | <p>Note 2</p>         |
|       |              | 11/7/2019 18:54  | Someone | <p>Note 3</p>         |
|       |              | 11/8/2019 18:54  | Someone | <p>Note 4</p>         |
|       |              | 11/9/2019 18:54  | Someone | <p>Note 5</p>         |
|       |              | 11/10/2019 18:54 | Someone | <p>Note 6</p>         |
| Paul  | UID1665588   |                  |         |                       |
+-------+--------------+------------------+---------+-----------------------+

Salida deseada:

+-------+--------------+-----------------------------------+
| Name  |      ID      |               Notes               |
+-------+--------------+-----------------------------------+
| Danny | UID11224512  | "11/5/2019 (Joe) - Note for Danny |
|       |              | 11/5/2019 (John) - Note 2"        |
| Joe   | UID11224956  | "11/5/2019 (Someone) - Note 1     |
|       |              | 11/5/2019 (Someone) - Note 2"     |
| Jane  | UID11224959  | "11/5/2019 (Danny) - Note 1       |
|       |              | 11/5/2019 (Shawn) - Note 2        |
|       |              | 11/5/2019 (Jane) - Note 3"        |
| Tom   | UID115466652 |                                   |
| Eric  | UID168998955 |                                   |
| Paula | UID166559885 |                                   |
| Frank | UID112249569 | "11/5/2019 (Someone) - Note 1     |
|       |              | 11/6/2019 (Someone) - Note 2      |
|       |              | 11/7/2019 (Someone) - Note 3      |
|       |              | 11/8/2019 (Someone) - Note 4      |
|       |              | 11/9/2019 (Someone) - Note 5      |
|       |              | 11/10/2019 (Someone) - Note 6"    |
| Paul  | UID1665588   |                                   |
+-------+--------------+-----------------+---------+-----------------------------------+


    

Data de muestra:
Data de muestra

Salida deseada:
Salida deseada

Respuesta1

Una forma de hacerlo es con Power Query, disponible en Windows Excel 2010+ y Office 365.

  • Seleccione alguna celda en su tabla de datos
    • Data => Get&Transform => from Table/Range
    • En la interfaz de usuario de Power Query:Home => Advanced Editor
    • Tome nota del nombre de la tabla en la línea 2
    • Pegue el MCode a continuación en la ventana
    • Cambie el nombre de la tabla en la línea 2 a su nombre de tabla real
    • Lea el código, los comentarios y examine la Applied Stepsventana para comprender qué está pasando.

Algoritmo breve

  • Fill downlos espacios en blanco para las columnas Nombre e ID
  • Grouppor las columnas Nombre e ID
  • Extrae elPrimerofecha, persona y nota como se muestra en columnas separadas
  • Combine todas las fechas/personas/notas (separadas por cambios de línea) para la última columna

Código M
En el código siguiente, asegúrese de cambiar el nombre de la tabla en la Línea 2 por el nombre real de su tabla.

let
    Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"ID", type text}, {"Date", type datetime}, {"Person", type text}, {"Notes", type text}}),
    
//Fill down to fill in the blanks for Name and ID columns
    #"Filled Down" = Table.FillDown(#"Changed Type",{"Name", "ID"}),

//Group on Name and ID -- should be the same so this is a double check.
    #"Grouped Rows" = Table.Group(#"Filled Down", {"Name", "ID"}, {

//For each Name/ID
    //Extract first Date as a date string if it has no time component, otherwise leave it as a datetime 
        {"Date", each if DateTime.Time([Date]{0}) = #time(0,0,0)
                            then DateTime.ToText([Date]{0},"MM/dd/yy")
                            else [Date]{0}},
    //Extract first Person
        {"Person", each [Person]{0}},

    //extract first Note
        {"Notes.1", each [Notes]{0}},

    //Extract and combine, for each note, the Date, person, and note
    //  Then split the combination for each entry by linefeed.
        {"Notes.2", (t)=> Text.Combine(
                            List.Generate(() => [Count=1, 
                            dt =DateTime.ToText(t[Date]{0},"MM/dd/yyyy") & " (" & 
                                t[Person]{0} & 
                                ") - " & t[Notes]{0}],
                         each [Count] <= Table.RowCount(t), 
                         each [Count = [Count] + 1, dt = DateTime.ToText(t[Date]{[Count]},"MM/dd/yyyy") & 
                                    " (" & t[Person]{[Count]} & 
                                    ") - " & t[Notes]{[Count]}],
                         each [dt]),"#(lf)")
                    }
        })
in
    #"Grouped Rows"

Datos
ingrese la descripción de la imagen aquí

Resultados
ingrese la descripción de la imagen aquí

En Excel, deberá formatear la Notes.2columna Wrap Texty la Datecolumna a mm/dd/yyyy hh:mm (En la columna de fecha, las fechas sin horas se devuelven como cadenas de texto, por lo que no tendrán el mismo formato, nuevamente como se muestra en su pregunta.)

Respuesta2

Asegúrese de configurar "Ajustar texto" en la cinta Inicio para toda la columna de comentarios. Utilice esta fórmula para combinar valores de texto con saltos de línea:

="comment1" & CHAR(10) & "Comment2"

Si está combinando dos tablas separadas, puede que valga la pena investigar Power Query en Excel.

información relacionada