Excel 转置到多列换行n

Excel 转置到多列换行n,excel,powerquery,vba,Excel,Powerquery,Vba,我需要将学生编号和姓名从行转置/透视到多列,但限制为15列,因此如果超过15列,我需要开始一个新行。这需要针对每个中心、主题和类型。我想换张新床单,或者去掉多余的几行。我无法成功地将这两个列重复步进到新列中。 大约有50万行。请帮帮我,我卡住了 例如: Center Course Type Student_Num Student_Name 1001 Science 1 1 John 1001 Science 1 2 Linda 1001 Science

我需要将学生编号和姓名从行转置/透视到多列,但限制为15列,因此如果超过15列,我需要开始一个新行。这需要针对每个中心、主题和类型。我想换张新床单,或者去掉多余的几行。我无法成功地将这两个列重复步进到新列中。 大约有50万行。请帮帮我,我卡住了

例如:

Center  Course  Type    Student_Num Student_Name
1001    Science 1   1   John
1001    Science 1   2   Linda
1001    Science 1   3   Pete
1001    Science 2   1   Susan
1001    Science 2   2   Gary
1001    English 1   1   Bob
1001    English 1   2   Kate
1002    Science 1   1   Alice
1002    Science 1   2   Rick
1002    Science 1   3   Pat
1002    Science 1   4   Shanon
1002    Science 1   5   Louis
1002    English 1   1   Cathleen
转化:

Center  Course  Type    Student1_Num    Student1_Name   Student2_Num    Student2_Name
1001    Science 1   1   John    2   Linda
1001    Science 1   3   Pete        
1001    Science 2   1   Susan   2   Gary
1001    English 1   1   Bob 2   Kate
1002    Science 1   1   Alice   2   Rick
1002    Science 1   3   Pat 4   Sharon
1002    Science 1   5   Louis       
1002    English 1   1   Cathleen        
希望这不是重复,但我无法找到任何可以给我正确结果的东西
感谢一个包含参数、列表和查询的解决方案

它的性能相当好:

我用Excel测试了100000条记录,大约用了15秒

大约2:15分钟内录制50万张唱片

就每行学生人数而言,这是动态的

参数MaxStudentsPerRow:

List ExpandList,生成具有以下内容的嵌套列表:

0,Student1\u Num,Student1\u Name

1,Student2_Num,Student2_Name

等等

查询: 基本上,通过表为每个键组合添加一个索引。组,添加一些具有模和整数除法计算的索引作为数据透视的准备,num和name组合在一个记录中,表使用高级选项“不聚合”进行数据透视,使用List.Accumulate和ExpandList中的数据对num和name的嵌套记录进行展开

let
    Source = Table1,
    #"Grouped Rows" = Table.Group(Source, {"Center", "Course", "Type"}, {{"AllData", each Table.AddIndexColumn(_,"Index",0,1)}}),
    #"Expanded AllData" = Table.ExpandTableColumn(#"Grouped Rows", "AllData", {"Student_Num", "Student_Name", "Index"}, {"Student_Num", "Student_Name", "Index"}),
    #"Duplicated Column" = Table.DuplicateColumn(#"Expanded AllData", "Index", "Index - Copy"),
    #"Calculated Modulo" = Table.TransformColumns(#"Duplicated Column", {{"Index", each Number.Mod(_, MaxStudentsPerRow), type number}}),
    #"Integer-Divided Column" = Table.TransformColumns(#"Calculated Modulo", {{"Index - Copy", each Number.IntegerDivide(_, MaxStudentsPerRow), Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Integer-Divided Column", "NumAndName", each Record.FromList({[Student_Num],[Student_Name]},{"Num","Name"})),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Student_Num", "Student_Name"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Columns",{{"Index", type text}}),
    #"Pivoted Column" = Table.Pivot(#"Changed Type", List.Distinct(#"Changed Type"[Index]), "Index", "NumAndName"),
    #"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Index - Copy"}),
    Expanded = List.Accumulate(ExpandList,#"Removed Columns1",(t,e) => Table.ExpandRecordColumn(t,e{0},{"Num","Name"},{e{1},e{2}}))
in
    Expanded

明亮的马塞尔:你是个天才,超快的结果。花了1:20分钟将511853条记录处理为34144行。谢谢
let
    Source = {1..MaxStudentsPerRow},
    ToText = List.Transform(Source, each {Text.From(_-1), "Student"&Text.From(_)}),
    AddedNumAndName = List.Transform(ToText,each {_{0},_{1}&"_Num",_{1}&"_Name"})
in
    AddedNumAndName
let
    Source = Table1,
    #"Grouped Rows" = Table.Group(Source, {"Center", "Course", "Type"}, {{"AllData", each Table.AddIndexColumn(_,"Index",0,1)}}),
    #"Expanded AllData" = Table.ExpandTableColumn(#"Grouped Rows", "AllData", {"Student_Num", "Student_Name", "Index"}, {"Student_Num", "Student_Name", "Index"}),
    #"Duplicated Column" = Table.DuplicateColumn(#"Expanded AllData", "Index", "Index - Copy"),
    #"Calculated Modulo" = Table.TransformColumns(#"Duplicated Column", {{"Index", each Number.Mod(_, MaxStudentsPerRow), type number}}),
    #"Integer-Divided Column" = Table.TransformColumns(#"Calculated Modulo", {{"Index - Copy", each Number.IntegerDivide(_, MaxStudentsPerRow), Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Integer-Divided Column", "NumAndName", each Record.FromList({[Student_Num],[Student_Name]},{"Num","Name"})),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Student_Num", "Student_Name"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Columns",{{"Index", type text}}),
    #"Pivoted Column" = Table.Pivot(#"Changed Type", List.Distinct(#"Changed Type"[Index]), "Index", "NumAndName"),
    #"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Index - Copy"}),
    Expanded = List.Accumulate(ExpandList,#"Removed Columns1",(t,e) => Table.ExpandRecordColumn(t,e{0},{"Num","Name"},{e{1},e{2}}))
in
    Expanded