我想将行与常用值合并,并在一列中连接差异。
我认为最简单的方法就是向您展示一个例子。
输入:
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
我确实看到了其他一些帖子,但我不认为它们正是我想要做的。
答案 0 :(得分:1)
如果|
你的意思是separete cell,那么跟随宏(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"
答案 1 :(得分:1)
在新的工作表中,您可以使用这些公式创建唯一的客户名称和状态的列表。
您需要使用两个协调功能,在新工作表的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
标识的行-Function2:
IF
函数根据源数据是否匹配行的唯一客户和状态来创建TRUE
或FALSE
的两个数组。TRUE
时,创建一个新数组TRUE
。 (意味着客户和州都匹配)IF
语句返回县,如果为true,如果为false,则返回空单元格""
TEXTJOIN
过滤出空单元格(TRUE
正在这样做),并将它们与逗号和空格(定界符)连接在一起。答案 2 :(得分:0)
在下面的超链接中,您将找到此问题的解决方案。查找部分&#34;如何将重复行合并为一个(仅保留唯一值)&#34;
How To Merge Rows For many Scenarios
更新:执行任务的加载项不是免费的,但有15天的免费试用版