6

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

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

输入:

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

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

4

3 回答 3

2

如果|您的意思是单独的单元格,那么下面的宏(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"
于 2013-02-05T22:48:01.200 回答
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)),"")

为此,必须满足以下条件

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

(这个答案是从这个问题中采用的。有一些变体作为其他答案)

使用数组函数返回 中的县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

-功能2:

  1. IF函数创建两个数组TRUEFALSE基于源数据是否匹配唯一的客户和行的状态。
  2. 这些数组相乘,创建一个新数组,TRUE仅当两个条目都是TRUE. (表示客户和状态都匹配)
  3. 如果为真,则该IF语句返回县,如果为假,则返回空单元格""
  4. TEXTJOIN过滤掉空单元格(这就是TRUE正在做的事情)并用逗号和空格(分隔符)将它们连接在一起。
于 2018-09-15T12:49:46.320 回答
0

In the hyperlink below you'll find the solution to this question. Look for the section "How to combine duplicate rows into one (keeping unique values only)"

How To Merge Rows For many Scenarios

Update: The Add-in that performs the task is not free, but there is a 15 day free trial version

于 2015-01-30T22:02:07.443 回答