首页 > 解决方案 > 如何在excel中合并数据行

问题描述

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

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

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

左边是我所拥有的,右边是我想要实现的: 在此处输入图像描述

标签: excelvba

解决方案


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

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

  • 选择 ID、Order 和 Class 列
  • Group By
    • 对于聚合有最小的开始;最大结束;和长度总和
  • 将 Class 列移回末尾

瞧!

在此处输入图像描述

这一切都可以从 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步骤中,您选择聚合 begin/end,而不是按 max/min 聚合All Rows。这将创建一个表,其中包含每个组的开始和结束条目。List.First然后,您可以使用andList.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 的值区域。

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

在此处输入图像描述


推荐阅读