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)),"")
为此,必须满足以下条件
-
这需要放在第二个工作表中(相应地重命名
Sheet2
)
Sheet1!$A$2:$A$6
和 Sheet1!$B$2:$B$6
应修改(工作表名称和范围)以分别包含您的客户名称和状态的完整列表。如果列表太长,唯一值列表中的最后一个条目将为 b 0
以上公式应分别粘贴在Sheet2!A2
和Sheet2!B2
中
这些是数组公式。它应该输入到指定的单元格,然后点击ctrl+alt+enter
提交
将初始公式作为数组输入A2
和B2
后,将公式复制并粘贴到Column A
和Column 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
的数组,如果不在列表中,则返回 0
。
MATCH
查看COUNTIFS
数组,并确定第一个0
INDEX
查看您的源数据,并返回由 MATCH
标识的行
-函数2:
IF
函数根据源数据是否与唯一客户和行的状态相匹配,创建两个 TRUE
或 FALSE
数组。
这些数组相乘,创建一个新数组TRUE
,前提是两个条目都是TRUE
。 (表示客户和状态都匹配)
IF
语句如果为真,则返回县,如果为假,则返回空单元格""
TEXTJOIN
过滤掉空单元格(这就是 TRUE
所做的)并用逗号和空格(分隔符)将它们连接在一起。
【讨论】:
【参考方案3】:在下面的超链接中,您将找到该问题的解决方案。查找“如何将重复的行合并为一个(仅保留唯一值)”部分
How To Merge Rows For many Scenarios
更新:执行任务的插件不是免费的,但有15天免费试用版
【讨论】:
最好将相关信息放在您的答案和链接中。这样,即使链接断开,您的答案也将保持有效,并且人们将能够在上下文中看到它。 我的坏詹姆斯。这个答案是一种简单的出路。我不确定插件如何执行创建最终合并单元格的必要功能。以上是关于Excel - 合并具有共同值的行并将差异连接在一列中的主要内容,如果未能解决你的问题,请参考以下文章