Excel динамически транспонирует каждый раз при обнаружении адреса электронной почты - PullRequest
0 голосов
/ 07 августа 2020

У меня есть столбец в Excel, содержащий длинный список, подобный следующему:

alfa.zulu@test.com
9v46by8
9016767312
TX961779
1DM90F4
bravo.zulu@test.com
B935536
24086942
9486388284
UAUG350583
0P47MB2
asd65f4
813asdg
357yvjy
jxvn97
iopu634
charlie.zulu@test.com
1DM90F4
0P47MB2
delta.zulu@test.com
9016767312
asd65f4
357yvjy
iopu634
echo.zulu@test.com
9v46by8
TX961779
B935536

Мне нужно транспонировать список, НО каждый раз, когда у меня есть адрес электронной почты, мне нужно перейти к следующую строку и начните все сначала, например:

alfa.zulu@test.com  9v46by8 9016767312  TX961779    1DM90F4                     
bravo.zulu@test.com B935536 24086942    9486388284  UAUG350583  0P47MB2 asd65f4 813asdg 357yvjy 
charlie.zulu@test.com   1DM90F4 0P47MB2                             
delta.zulu@test.com 9016767312  asd65f4 357yvjy iopu634                     
echo.zulu@test.com  9v46by8 TX961779    B935536 

                    

Есть ли способ добиться этого без использования vba? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Это можно сделать, объединив функции INDEX, AGGREGATE и SEARCH. Но есть некоторые предварительные условия:

  1. Функция SEARCH будет искать ячейки с символом @ - поэтому он должен быть только в адресах электронной почты
  2. В конце список, в первую пустую ячейку необходимо ввести символ @

Формула:

=IFERROR(INDEX(INDEX($A$1:$A$30,AGGREGATE(15,6,(1/ISNUMBER(SEARCH("@",$A$1:$A$30)))*ROW($A$1:$A$30),ROW())):INDEX($A$1:$A$30,AGGREGATE(15,6,(1/ISNUMBER(SEARCH("@",$A$1:$A$30)))*(ROW($A$1:$A$30)-1),ROW()+1)),COLUMN()-2),"")

введите описание изображения здесь

Если список очень длинный, возможно, лучше последовать совету Рона.

0 голосов
/ 07 августа 2020

С Power Query:

  • Сделайте тип данных столбца = text

  • Проверьте, является ли запись электронной почтой - используя @ но может быть более сложным

  • Добавить столбец индекса

  • Добавить еще один столбец, который содержит уникальный номер каждый раз, когда в столбце есть электронное письмо 1

  • Введите уникальные числа, чтобы каждая «группа» имела одинаковый номер

  • Сгруппируйте строки в столбце уникальных номеров

  • Извлеките данные из каждой строки в список с разделителями

  • Добавьте несколько logi c, чтобы разрешить вариации в количестве потенциальных столбцов, иначе запрос питания не адаптируется.

  • Разделить список данных на новые столбцы на основе разделителя

  • Попутно мы удалить посторонние столбцы

  • Вставьте приведенный ниже код в редактор Power Query.
  • Измените таблицу в строке 2, чтобы отразить настоящее имя таблицы на вашем листе.
  • Дважды щелкните операторы в Applied Steps окно для изучения того, что делается на каждом шаге
  • Ссылка sh - это все, что должно потребоваться, если ваша таблица данных изменится.

M-код

let
    Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "isEmail", each Text.Contains([Column1],"@")),
    #"Added Index" = Table.AddIndexColumn(#"Added Custom", "Index", 0, 1, Int64.Type),
    #"Added Custom1" = Table.AddColumn(#"Added Index", "Grouper", each if [isEmail]  then [Index] else null),
    #"Filled Down" = Table.FillDown(#"Added Custom1",{"Grouper"}),
    #"Removed Columns" = Table.RemoveColumns(#"Filled Down",{"isEmail", "Index"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Grouper"}, {{"Grouped", each _, type table [Column1=nullable text, Grouper=number]}}),
    #"Added Custom2" = Table.AddColumn(#"Grouped Rows", "Value", each Table.Column([Grouped],"Column1")),
    #"Removed Columns2" = Table.RemoveColumns(#"Added Custom2",{"Grouper", "Grouped"}),
    #"Added Custom3" = Table.AddColumn(#"Removed Columns2", "numSplits", each List.Count([Value])),

        //Make column splitting dynamic for each refresh, in case maximum number of columns changes
        splits = List.Max(Table.Column(#"Added Custom3","numSplits")),
        newColList = List.Zip({List.Repeat({"Value"},splits),List.Generate(() => 1, each _ <= splits, each _ +1)}),
        #"Converted to Table" = Table.FromList(newColList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        newColNamesTbl = Table.TransformColumns(#"Converted to Table", {"Column1", each Text.Combine(List.Transform(_, Text.From)), type text}),
        newColNamesList = Table.Column(newColNamesTbl,"Column1"),
        
    #"Extracted Values" = Table.TransformColumns(#"Added Custom3", {"Value", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),
    #"Removed Columns1" = Table.RemoveColumns(#"Extracted Values",{"numSplits"}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Removed Columns1", "Value", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), newColNamesList)
in
    #"Split Column by Delimiter"

Исходные данные

enter image description here

Results

введите описание изображения здесь

...