Excel-将行与公共值合并,并将差异连接到一列中

Excel-将行与公共值合并,并将差异连接到一列中,excel,vba,excel-formula,merge,concatenation,Excel,Vba,Excel Formula,Merge,Concatenation,我希望合并具有公共值的行,并将差异连接到一列中 我认为最简单的方法就是给你举个例子 输入: Customer Name | NEW YORK | ALBANY Customer Name | NEW YORK | CLINTON Customer Name | NEW YORK | COLUMBIA Customer Name | NEW YORK | DELAWARE Customer Name | NE

我希望合并具有公共值的行,并将差异连接到一列中

我认为最简单的方法就是给你举个例子

输入:

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
所需输出:

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

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

如果你说的是分离单元格,那么下面的宏(Excel 2007)应该会起作用(你的数据从单元格A1开始):

Application.ScreenUpdate=False
最后一行=单元格(Rows.Count,1).End(xlUp).row
'第一:确保数据已排序
Sort.SortFields.Clear
Sort.SortFields.Add Key:=列(“A:A”),SortOn:=xlSortOnValues
Sort.SortFields.Add Key:=列(“B:B”),SortOn:=xlSortOnValues
Sort.SortFields.Add Key:=列(“C:C”),SortOn:=xlSortOnValues
有条不紊
.SetRange范围(“A1:C”和最后一行)
.Header=xlNo
.MatchCase=False
.方向=xlTopToBottom
.SortMethod=xl拼音
.申请
以
'然后:连接文本,直到两个相邻行中的键值发生更改
myText=“”
myPos=1
对于最后一行的i=1
如果单元格(i,1).值单元格(i+1,1).值或单元格(i,2).值单元格(i+1,2).值,则
单元格(myPos,5).Value=单元格(i,1).Value
单元格(myPos,6)。值=单元格(i,2)。值
myText=myText&单元格(i,3).值
单元格(myPos,7)。值=myText
myText=“”
myPos=myPos+1
其他的
myText=myText&单元格(i,3).值&“
如果结束
接下来我
Application.ScreenUpdating=True
MsgBox“完成”

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


更新:执行此任务的加载项不是免费的,但有15天的免费试用版。在新的工作表中,您可以使用这些公式创建唯一客户名称和状态的列表

您需要使用两个协调功能,在新的工作表中,在
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
  • 以上公式应粘贴在
    表2中!A2
    表2!B2
    分别
  • 这些是数组公式。它应该输入到指定的单元格中,然后通过点击
    ctrl+alt+enter
  • 将初始公式作为数组输入到
    A2
    B2
    中后,将公式复制并粘贴到
    列A
    列B
    ,直到不再显示唯一的名称 (此答案采用自。与其他答案一样,有几个变体)

    使用数组函数返回
    列C
    中的县。将公式粘贴到
    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
    语句返回country IF true,IF false,空单元格
    “”
  • TEXTJOIN
    过滤掉空单元格(这就是
    TRUE
    所做的),并用逗号和空格(分隔符)将它们连接在一起

  • 您想使用宏还是排除公式?请告诉我们你的工作。到目前为止,我除了寻找答案外什么也没做。除了内置函数之外,我还没有尝试过其他任何东西。还有一件事我忘了提一下,这些行可以重复两到五十份,只有县不同。所以我需要合并州名和客户名,并将县连接起来。有人对此有公式吗?我需要做这样的事情来创建一个可管理的模板,而大多数人都不知道如何管理宏…最好将相关信息放在答案和链接中。这样,即使链接断开,你的答案仍然有效,人们可以在上下文中看到它。我的坏詹姆斯。这个答案有点简单。我不确定外接程序如何执行创建最终合并单元格所需的功能。