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

时间:2013-02-05 22:21:55

标签: excel excel-vba merge excel-formula concatenation

我想将行与常用值合并,并在一列中连接差异。

我认为最简单的方法就是向您展示一个例子。

输入:

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

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

3 个答案:

答案 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)),"")

要使其正常工作,必须满足以下条件

  1. 这需要放置在第二个工作表中(相应地重命名Sheet2
  2. Sheet1!$A$2:$A$6Sheet1!$B$2:$B$6应该进行修改(工作表名称和范围)以分别包含您的客户名称和状态的完整列表。如果列表太长,则唯一值列表中的最后一个条目将为b 0
  3. 以上公式应分别粘贴到Sheet2!A2Sheet2!B2
  4. 这些是数组公式。应将其输入指定的单元格,然后点击ctrl+alt+enter
  5. 提交
  6. 将初始公式作为数组输入到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:

  1. COUNTIFS查看您的源数据,如果列表中已经存在1,则返回包含0的数组。
  2. MATCH查看COUNTIFS数组,并标识第一个0
  3. INDEX查看您的源数据,并返回由MATCH标识的行

-Function2:

  1. IF函数根据源数据是否匹配行的唯一客户和状态来创建TRUEFALSE的两个数组。
  2. 这些数组相乘,仅当两个条目均为TRUE时,创建一个新数组TRUE。 (意味着客户和州都匹配)
  3. IF语句返回县,如果为true,如果为false,则返回空单元格""
  4. TEXTJOIN过滤出空单元格(TRUE正在这样做),并将它们与逗号和空格(定界符)连接在一起。

答案 2 :(得分:0)

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

How To Merge Rows For many Scenarios

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