Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сортировка данных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Сортировка данных (Формулы/Formulas)
Сортировка данных
Jump032 Дата: Четверг, 19.11.2020, 00:22 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel2013
Всем привет!

Мне нужно придумать такой алгоритм действий или макрокоманду, чтобы приводить данные на Листе 1 к виду, как на Листе 2. Сложность в том, что в записях могут отсутствовать определенные данные. Единица данных – это два столбца влево от пустого места.

На этапе формирования я добавлял к столбцам метки «{Дата рождения:{», «{Дата хиротонии:{», «{Дата пострига:{» (все это можно увидеть в прикрепленном файле). Идея в том, чтобы используя разбивку текста по столбцам равномерно распределить данные.

Как оказалось, не все карточки содержат одинаковое количество записей. Отсюда при разбивке в одном столбце на 200 записей «Дата хиротонии:», может оказаться 10-15 «Дата пострига:».
К сообщению приложен файл: 5299779.xlsx (464.4 Kb)
 
Ответить
СообщениеВсем привет!

Мне нужно придумать такой алгоритм действий или макрокоманду, чтобы приводить данные на Листе 1 к виду, как на Листе 2. Сложность в том, что в записях могут отсутствовать определенные данные. Единица данных – это два столбца влево от пустого места.

На этапе формирования я добавлял к столбцам метки «{Дата рождения:{», «{Дата хиротонии:{», «{Дата пострига:{» (все это можно увидеть в прикрепленном файле). Идея в том, чтобы используя разбивку текста по столбцам равномерно распределить данные.

Как оказалось, не все карточки содержат одинаковое количество записей. Отсюда при разбивке в одном столбце на 200 записей «Дата хиротонии:», может оказаться 10-15 «Дата пострига:».

Автор - Jump032
Дата добавления - 19.11.2020 в 00:22
прохожий2019 Дата: Четверг, 19.11.2020, 01:31 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 1244
Репутация: 317 ±
Замечаний: 0% ±

365 Beta Channel
алгоритм действий
[vba]
Код
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
[/vba]
К сообщению приложен файл: 5299779-3-.xlsb (55.2 Kb)


Сообщение отредактировал прохожий2019 - Четверг, 19.11.2020, 10:46
 
Ответить
Сообщение
алгоритм действий
[vba]
Код
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
[/vba]

Автор - прохожий2019
Дата добавления - 19.11.2020 в 01:31
Jump032 Дата: Пятница, 20.11.2020, 11:16 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel2013
При запуске кода Excel выдает ошибку (см. Экран-4). Ошибка выходит независимо от запускаемого документа. Жалуется на to = Table.FromRecords(tbl[tmp],null, MissingField.UseNull) Версия Office 2013 (x32), PowerQuery_2.59.5135.201 (32-bit) [ru-RU]
К сообщению приложен файл: 8068671.jpg (48.7 Kb)


Сообщение отредактировал Jump032 - Пятница, 20.11.2020, 20:40
 
Ответить
СообщениеПри запуске кода Excel выдает ошибку (см. Экран-4). Ошибка выходит независимо от запускаемого документа. Жалуется на to = Table.FromRecords(tbl[tmp],null, MissingField.UseNull) Версия Office 2013 (x32), PowerQuery_2.59.5135.201 (32-bit) [ru-RU]

Автор - Jump032
Дата добавления - 20.11.2020 в 11:16
Jump032 Дата: Пятница, 20.11.2020, 19:52 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel2013
Ребята, на всякий случай. Разместил копию темы на Planetaexcel.ru


Сообщение отредактировал Jump032 - Пятница, 20.11.2020, 20:18
 
Ответить
СообщениеРебята, на всякий случай. Разместил копию темы на Planetaexcel.ru

Автор - Jump032
Дата добавления - 20.11.2020 в 19:52
прохожий2019 Дата: Пятница, 20.11.2020, 20:52 | Сообщение № 5
Группа: Проверенные
Ранг: Старожил
Сообщений: 1244
Репутация: 317 ±
Замечаний: 0% ±

365 Beta Channel
Разместил копию темы
там уже ответили:

[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],
    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
[/vba]
К сообщению приложен файл: 4201239.xlsx (53.6 Kb)


Сообщение отредактировал прохожий2019 - Пятница, 20.11.2020, 21:46
 
Ответить
Сообщение
Разместил копию темы
там уже ответили:

[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],
    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
[/vba]

Автор - прохожий2019
Дата добавления - 20.11.2020 в 20:52
Jump032 Дата: Пятница, 20.11.2020, 21:07 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel2013
прохожий2019, Все равно спасибо за помощь!
 
Ответить
Сообщениепрохожий2019, Все равно спасибо за помощь!

Автор - Jump032
Дата добавления - 20.11.2020 в 21:07
прохожий2019 Дата: Суббота, 21.11.2020, 10:13 | Сообщение № 7
Группа: Проверенные
Ранг: Старожил
Сообщений: 1244
Репутация: 317 ±
Замечаний: 0% ±

365 Beta Channel
так еще можно[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
[/vba]
К сообщению приложен файл: _1-1-.xlsx (54.6 Kb)


Сообщение отредактировал прохожий2019 - Суббота, 21.11.2020, 10:13
 
Ответить
Сообщениетак еще можно[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
[/vba]

Автор - прохожий2019
Дата добавления - 21.11.2020 в 10:13
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Сортировка данных (Формулы/Formulas)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!