Мне нужно придумать такой алгоритм действий или макрокоманду, чтобы приводить данные на Листе 1 к виду, как на Листе 2. Сложность в том, что в записях могут отсутствовать определенные данные. Единица данных – это два столбца влево от пустого места.
На этапе формирования я добавлял к столбцам метки «{Дата рождения:{», «{Дата хиротонии:{», «{Дата пострига:{» (все это можно увидеть в прикрепленном файле). Идея в том, чтобы используя разбивку текста по столбцам равномерно распределить данные.
Как оказалось, не все карточки содержат одинаковое количество записей. Отсюда при разбивке в одном столбце на 200 записей «Дата хиротонии:», может оказаться 10-15 «Дата пострига:».
Всем привет!
Мне нужно придумать такой алгоритм действий или макрокоманду, чтобы приводить данные на Листе 1 к виду, как на Листе 2. Сложность в том, что в записях могут отсутствовать определенные данные. Единица данных – это два столбца влево от пустого места.
На этапе формирования я добавлял к столбцам метки «{Дата рождения:{», «{Дата хиротонии:{», «{Дата пострига:{» (все это можно увидеть в прикрепленном файле). Идея в том, чтобы используя разбивку текста по столбцам равномерно распределить данные.
Как оказалось, не все карточки содержат одинаковое количество записей. Отсюда при разбивке в одном столбце на 200 записей «Дата хиротонии:», может оказаться 10-15 «Дата пострига:».Jump032
let from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], split = Table.SplitColumn(from, "Столбец1", Splitter.SplitTextByDelimiter("{")), f=(x)=>[a=List.RemoveNulls(Record.ToList(x)), b=a{0}, c = List.Split(List.Skip(a,1),2), d = List.Accumulate(c,[Имя=b],(x,y)=>if Record.HasFields(x,y{0}) then Record.AddField(x,y{0}&"1",y{1}) else Record.AddField(x,y{0},y{1}))][d], tbl = Table.AddColumn(split,"tmp",each f(_)), to = Table.FromRecords(tbl[tmp],null, MissingField.UseNull) in to
let from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], split = Table.SplitColumn(from, "Столбец1", Splitter.SplitTextByDelimiter("{")), f=(x)=>[a=List.RemoveNulls(Record.ToList(x)), b=a{0}, c = List.Split(List.Skip(a,1),2), d = List.Accumulate(c,[Имя=b],(x,y)=>if Record.HasFields(x,y{0}) then Record.AddField(x,y{0}&"1",y{1}) else Record.AddField(x,y{0},y{1}))][d], tbl = Table.AddColumn(split,"tmp",each f(_)), to = Table.FromRecords(tbl[tmp],null, MissingField.UseNull) in to
При запуске кода Excel выдает ошибку (см. Экран-4). Ошибка выходит независимо от запускаемого документа. Жалуется на to = Table.FromRecords(tbl[tmp],null, MissingField.UseNull) Версия Office 2013 (x32), PowerQuery_2.59.5135.201 (32-bit) [ru-RU]
При запуске кода Excel выдает ошибку (см. Экран-4). Ошибка выходит независимо от запускаемого документа. Жалуется на to = Table.FromRecords(tbl[tmp],null, MissingField.UseNull) Версия Office 2013 (x32), PowerQuery_2.59.5135.201 (32-bit) [ru-RU]Jump032
let f=(x)=>[a=List.RemoveNulls(Record.ToList(x)), b=a{0}, c = List.Split(List.Skip(a,1),2), d = List.Accumulate(c,[Имя=b],(x,y)=>if Record.HasFields(x,y{0}) then x else Record.AddField(x,y{0},y{1}))][d], g=(x)=>(y)=>List.Accumulate(x,y,(s,c)=>if Record.HasFields(s,c) then s else Record.AddField(s,c,null)),
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], split = Table.SplitColumn(from, "Столбец1", Splitter.SplitTextByDelimiter("{")), lst = List.Buffer(Table.AddColumn(split,"tmp",each f(_))[tmp]), nms = List.Distinct(List.Combine(List.Transform(lst,Record.FieldNames))), recs = List.Transform(lst,g(nms)), to = Table.FromRecords(recs,null) in to
let f=(x)=>[a=List.RemoveNulls(Record.ToList(x)), b=a{0}, c = List.Split(List.Skip(a,1),2), d = List.Accumulate(c,[Имя=b],(x,y)=>if Record.HasFields(x,y{0}) then x else Record.AddField(x,y{0},y{1}))][d], g=(x)=>(y)=>List.Accumulate(x,y,(s,c)=>if Record.HasFields(s,c) then s else Record.AddField(s,c,null)),
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], split = Table.SplitColumn(from, "Столбец1", Splitter.SplitTextByDelimiter("{")), lst = List.Buffer(Table.AddColumn(split,"tmp",each f(_))[tmp]), nms = List.Distinct(List.Combine(List.Transform(lst,Record.FieldNames))), recs = List.Transform(lst,g(nms)), to = Table.FromRecords(recs,null) in to
let f=(x)=>[a=List.RemoveNulls(Record.ToList(x)), b=a{0}, c = List.Split(List.Skip(a,1),2), d = List.Accumulate(c,[Имя=b],(x,y)=>if Record.HasFields(x,y{0}) then x else Record.AddField(x,y{0},y{1}))][d],
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], split = Table.SplitColumn(from, "Столбец1", Splitter.SplitTextByDelimiter("{")), lst = Table.AddColumn(split,"tmp",each f(_))[[tmp]], nms = List.Distinct(List.Combine(List.Transform(lst[tmp],Record.FieldNames))), to = Table.ExpandRecordColumn(lst, "tmp", nms) in to
[/vba]
так еще можно[vba]
Код
let f=(x)=>[a=List.RemoveNulls(Record.ToList(x)), b=a{0}, c = List.Split(List.Skip(a,1),2), d = List.Accumulate(c,[Имя=b],(x,y)=>if Record.HasFields(x,y{0}) then x else Record.AddField(x,y{0},y{1}))][d],
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], split = Table.SplitColumn(from, "Столбец1", Splitter.SplitTextByDelimiter("{")), lst = Table.AddColumn(split,"tmp",each f(_))[[tmp]], nms = List.Distinct(List.Combine(List.Transform(lst[tmp],Record.FieldNames))), to = Table.ExpandRecordColumn(lst, "tmp", nms) in to