Ссылаясь на прикрепленное изображение с образцами данных, я хотел бы объединить дату, человека и примечание из нескольких строк в одну строку с переносами строк для каждого набора объединенных значений. Каждая заметка занимает строку с пустыми Name и ID, поэтому каждую строку под основной строкой со значениями нужно будет объединить. См. прикрепленное изображение для данных и желаемого вывода.
Образец данных:
+-------+--------------+------------------+---------+-----------------------+
| 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 | | | |
+-------+--------------+------------------+---------+-----------------------+
Желаемый результат:
+-------+--------------+-----------------------------------+
| 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 | |
+-------+--------------+-----------------+---------+-----------------------------------+
решение1
Один из способов сделать это — использовать Power Query, доступный в Windows Excel 2010+ и Office 365.
- Выберите ячейку в таблице данных.
Data => Get&Transform => from Table/Range
- В пользовательском интерфейсе Power Query:
Home => Advanced Editor
- Запишите название таблицы в строке 2.
- Вставьте приведенный ниже код M в окно.
- Измените имя таблицы в строке 2 на фактическое имя таблицы.
- Прочитайте код, комментарии и изучите
Applied Steps
окно, чтобы понять, что происходит.
Краткий алгоритм
Fill down
пробелы для столбцов Имя и IDGroup
по столбцам Имя и ID- ИзвлечьПервыйдата, персона и примечание отображаются в отдельных столбцах
- Объедините все даты/персоны/примечания (разделенные переводами строк) для последнего столбца.
М-код
В приведенном ниже коде обязательно измените имя таблицы в строке 2 на фактическое имя таблицы.
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"
В Excel вам нужно будет отформатировать столбец Notes.2
так, чтобы он был равен Wrap Text
, а Date
столбец — mm/dd/yyyy hh:mm
(В столбце даты даты без времени возвращаются как текстовые строки, поэтому не будут иметь тот же формат — опять же, как вы показали в своем вопросе.)
решение2
Обязательно установите "Wrap Text" на ленте Home для всего столбца комментариев. Используйте эту формулу для объединения текстовых значений с переносами строк:
="comment1" & CHAR(10) & "Comment2"
Если вы объединяете две отдельные таблицы, возможно, стоит рассмотреть Power Query в Excel.