【问题标题】:How to consolidate rows of data in excel如何在excel中合并数据行
【发布时间】:2020-01-22 11:10:44
【问题描述】:

我正在尝试合并具有相同 ID、顺序和类的行。但是,合并的行需要对长度求和,并输入正确的开始和结束。所以合并的行将具有第一行的开始值和最后一行的结束值请检查图像以了解我的意思。

我很确定我可以使用 SUMIF 实现长度的总和,但我不知道如何将正确的开始值和结束值输​​入到合并的行中。

这甚至可以用 excel 实现吗?我不能使用数据透视表,因为我不是简单地尝试对长度求和,我希望列保持不变,只是为了相应地合并行。任何帮助将不胜感激!

左边是我所拥有的,右边是我想要实现的:

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    在您的示例中,您想要的 beginend 似乎分别是 minmax,我在方法中使用了它。

    使用 Excel 2010+ 中提供的 Power Query 相对简单。

    • 选择 ID、Order 和 Class 列
    • Group By
      • 对于聚合有 min of begin;最大结束;和长度总和
    • 将“类”列移回末尾

    瞧!

    这一切都可以通过 UI 快速完成

    M 码

    let
        Source = Excel.CurrentWorkbook(){[Name="Table7"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Order", Int64.Type}, {"begin", Int64.Type}, {"end", Int64.Type}, {"length", Int64.Type}, {"class", Int64.Type}}),
        #"Grouped Rows" = Table.Group(#"Changed Type", {"ID", "Order", "class"}, {{"Begin", each List.Min([begin]), type number}, {"End", each List.Max([end]), type number}, {"Length", each List.Sum([length]), type number}}),
        #"Reordered Columns" = Table.ReorderColumns(#"Grouped Rows",{"ID", "Order", "Begin", "End", "Length", "class"})
    in
        #"Reordered Columns"
    

    为了完整起见:如果您确实需要为BeginEnd 使用每个组中的第一行和最后一行,而不是Min/Max,则可以使用以下代码。

    group by 步骤中,您选择All Rows 的聚合,而不是按最大/最小聚合开始/结束。这将创建一个表,其中包含每个组的开始和结束条目。然后,您可以使用 List.FirstList.Last 函数提取第一个和最后一个条目。

    自定义列的代码:

    List.First(Table.Column([#"Start/End"],"begin"))
    List.Last(Table.Column([#"Start/End"],"end"))
    

    M 码

    let
        Source = Excel.CurrentWorkbook(){[Name="Table7"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Order", Int64.Type}, {"begin", Int64.Type}, {"end", Int64.Type}, {"length", Int64.Type}, {"class", Int64.Type}}),
        #"Grouped Rows" = Table.Group(#"Changed Type", {"ID", "Order", "class"}, {{"Length", each List.Sum([length]), type number}, {"Start/End", each _, type table [ID=number, Order=number, begin=number, end=number, length=number, class=number]}}),
        #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Begin", each List.First(Table.Column([#"Start/End"],"begin"))),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "End", each List.Last(Table.Column([#"Start/End"],"end"))),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Start/End"}),
        #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"ID", "Order", "Begin", "End", "Length", "class"})
    in
        #"Reordered Columns"
    

    顺便说一句,您可以使用常规数据透视表非常接近(特别是如果您可以使用 Min/Max 作为开始/结束)。但是,它没有那么灵活,而且我认为您不能按照显示的方式对列进行排序。

    下面是一个简单的数据透视表。

    您将 ID、Order 和 class 拖到 Rows 区域。 您将 Begin、End 和 Length 拖动到应用 Min、Max 和 Sum 的值区域。

    然后以表格形式显示布局;关闭总计和小计,你有:

    【讨论】:

    • 我认为 Begin 和 End 是“第一行”和“最后一行”,而不是 Min/Max
    • @TimWilliams 这就是他所写的,但是 Min/Max 返回相同的结果,并且如果它们在组中从低到高排序会更简单。在 PQ 中当然可以通过行号来完成,但可能会增加不必要的复杂性。
    • 怎么样:radacad.com/…
    • @TimWilliams 这是一个很好且可行的方法,但更复杂(更多步骤和直接编写代码),如果可行,则只需使用 min/max。由于数据已经排序,如果顺序可能不同于最小/最大,我将聚合开始/以“所有行”开头并使用List.FirstList.Last
    • 我连简单的 M 代码都不知道,所以现在对我来说都是希腊语......
    【解决方案2】:

    带有公式的选项 - 以最简单的方式,将表格复制到新位置并使用 Remove duplicatesIdOrderClass 列中保留唯一值。接下来用以下公式填充列:

    开始(数组公式):

    {=INDEX($C$2:$C$9,MIN(IF(($A$2:$A$9=H2)*($B$2:$B$9=I2)*($F$2:$F$9=M2),ROW($A$2:$A$9)-MIN(ROW($A$2:$A$9))+1)),0)}

    结束(数组公式):

    {=INDEX($D$2:$D$9,MAX(IF(($A$2:$A$9=H2)*($B$2:$B$9=I2)*($F$2:$F$9=M2),ROW($A$2:$A$9)-MIN(ROW($A$2:$A$9))+1)),0)}

    长度(常规公式):

    =SUMPRODUCT($E$2:$E$9*($A$2:$A$9=H2)*($B$2:$B$9=I2)*($F$2:$F$9=M2))

    ctrl + shift + enter 确认编辑后的数组公式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2016-04-23
      • 1970-01-01
      • 2019-02-25
      • 2014-03-10
      • 2012-05-15
      相关资源
      最近更新 更多