Excel - 合并具有共同值的行并将差异连接在一列中

Posted

技术标签:

【中文标题】Excel - 合并具有共同值的行并将差异连接在一列中【英文标题】:Excel - Merge rows with common values and concatenate the differences in one column 【发布时间】:2013-01-21 00:07:15 【问题描述】:

我想合并具有共同值的行并将差异连接在一列中。

我认为最简单的做法是给你看一个例子。

输入:

Customer Name   |   NEW YORK    |   ALBANY 
Customer Name   |   NEW YORK    |   CLINTON    
Customer Name   |   NEW YORK    |   COLUMBIA
Customer Name   |   NEW YORK    |   DELAWARE
Customer Name   |   NEW YORK    |   DUTCHESS  
Customer Name   |   VERMONT     |   BENNINGTON  
Customer Name   |   VERMONT     |   CALEDONIA
Customer Name   |   VERMONT     |   CHITTENDEN
Customer Name   |   VERMONT     |   ESSEX
Customer Name   |   VERMONT     |   FRANKLIN

期望的输出:

Customer Name   |   VERMONT     |   BENNINGTON,CALEDONIA,CHITTENDEN,ESSEX,FRANKLIN
Customer Name   |   NEW YORK    |   ALBANY,CLINTON,COLUMBIA,DELAWARE,DUTCHESS

我确实看到了其他一些关于此的帖子,但我认为它们并不是我想要做的。

【问题讨论】:

您要使用宏公式还是 excle 公式?请把你的工作交给我们。 到目前为止,我什么也没做,只是在寻找答案。除了内置函数,我还没有尝试过任何东西。我忘记提到的另一件事是这些行可以重复两到五十个副本,只有县不同。所以我需要合并州和客户名称,并连接县。 有人有这个公式吗?我需要做这种事情来创建一个可管理的模板,而大多数人不知道如何管理宏...... 【参考方案1】:

如果| 是指单独的单元格,那么下面的宏 (Excel 2007) 应该可以解决问题(您的数据从单元格 A1 开始):

Application.ScreenUpdating = False

last_row = Cells(Rows.Count, 1).End(xlUp).Row

'first: make sure data is sorted
Sort.SortFields.Clear
Sort.SortFields.Add Key:=Columns("A:A"), SortOn:=xlSortOnValues
Sort.SortFields.Add Key:=Columns("B:B"), SortOn:=xlSortOnValues
Sort.SortFields.Add Key:=Columns("C:C"), SortOn:=xlSortOnValues

With Sort
    .SetRange Range("A1:C" & last_row)
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

'then: join text until key values in two neighboring row changes
myText = ""
myPos = 1

For i = 1 To last_row
    If Cells(i, 1).Value <> Cells(i + 1, 1).Value Or Cells(i, 2).Value <> Cells(i + 1, 2).Value Then
        Cells(myPos, 5).Value = Cells(i, 1).Value
        Cells(myPos, 6).Value = Cells(i, 2).Value

        myText = myText & Cells(i, 3).Value
        Cells(myPos, 7).Value = myText
        myText = ""
        myPos = myPos + 1
    Else
        myText = myText & Cells(i, 3).Value & ","
    End If
Next i

Application.ScreenUpdating = True
MsgBox "Done"

【讨论】:

【参考方案2】:

在新工作表中,您可以使用这些公式来创建唯一客户名称和状态的列表。

您需要使用两个协调函数,在新工作表中输入以下函数A2

=IFERROR(INDEX(Sheet1!$A$2:$A$6, MATCH(0, COUNTIFS(Sheet2!$A$1:A1, Sheet1!$A$2:$A$6,Sheet2!$B$1:B1, Sheet1!$B$2:$B$6), 0)),"")

以及B2中的以下函数

=IFERROR(INDEX(Sheet1!$B$2:$B$6, MATCH(0, COUNTIFS(Sheet2!$A$1:A1, Sheet1!$A$2:$A$6,Sheet2!$B$1:B1, Sheet1!$B$2:$B$6), 0)),"")

为此,必须满足以下条件

    这需要放在第二个工作表中(相应地重命名Sheet2Sheet1!$A$2:$A$6Sheet1!$B$2:$B$6 应修改(工作表名称和范围)以分别包含您的客户名称和状态的完整列表。如果列表太长,唯一值列表中的最后一个条目将为 b 0 以上公式应分别粘贴在Sheet2!A2Sheet2!B2中 这些是数组公式。它应该输入到指定的单元格,然后点击ctrl+alt+enter提交 将初始公式作为数组输入A2B2 后,将公式复制并粘贴到Column AColumn B 下,直到不再出现唯一名称。

(此答案取自this question。有一些变体作为其他答案)

使用数组函数返回ColumnC 中的县。将C2 中的公式粘贴为数组(包含更新的引用),然后将其复制到列表中。

=TEXTJOIN(", ",TRUE,IF((Sheet2!A2=Sheet1!$A$2:$A$6)*(Sheet2!B2=Sheet1!$B$2:$B$6),Sheet1!$C$2:$C$6,""))

简要说明这些函数的工作原理:

-功能1:

    COUNTIFS 查看您的源数据,如果它已经在列表中,则返回带有 1 的数组,如果不在列表中,则返回 0MATCH 查看COUNTIFS 数组,并确定第一个0 INDEX 查看您的源数据,并返回由 MATCH 标识的行

-函数2:

    IF 函数根据源数据是否与唯一客户和行的状态相匹配,创建两个 TRUEFALSE 数组。 这些数组相乘,创建一个新数组TRUE,前提是两个条目都是TRUE。 (表示客户和状态都匹配) IF 语句如果为真,则返回县,如果为假,则返回空单元格"" TEXTJOIN 过滤掉空单元格(这就是 TRUE 所做的)并用逗号和空格(分隔符)将它们连接在一起。

【讨论】:

【参考方案3】:

在下面的超链接中,您将找到该问题的解决方案。查找“如何将重复的行合并为一个(仅保留唯一值)”部分

How To Merge Rows For many Scenarios

更新:执行任务的插件不是免费的,但有15天免费试用版

【讨论】:

最好将相关信息放在您的答案和链接中。这样,即使链接断开,您的答案也将保持有效,并且人们将能够在上下文中看到它。 我的坏詹姆斯。这个答案是一种简单的出路。我不确定插件如何执行创建最终合并单元格的必要功能。

以上是关于Excel - 合并具有共同值的行并将差异连接在一列中的主要内容,如果未能解决你的问题,请参考以下文章

如何将选择限制为仅具有共同值的行?

R组合具有相似值的行

合并具有部分相同值的行

电源查询。合并具有折叠值的行中的重复行

如何在Google表格中合并具有相同索引且具有不同值的行?

合并具有部分匹配值的行