电子表格公式将所有匹配收集到一个单元格中

时间:2012-04-19 13:11:47

标签: excel formula google-sheets worksheet-function array-formulas

我有一个看起来像这样的电子表格:

A             B              C          D                
FirstName     SurnameName    Address    UniqueFamilyId      
---------------------------------------------------------
Abe           Black          1 Elm Ave  :Black:1 Elm Ave:
Joe           Doe            7 Park Ln  :Doe:7 Park Lane:
Jack          Black          1 Elm Ave  :Black:1 Elm Ave:
Bill          Doe            2 5th Ave  :Doe:2 5th Ave:
Harry         Doe            7 Park Ln  :Doe:7 Park Lane:
Sam           Doe            7 Park Ln  :Doe:7 Park Lane:

我创建了UniqueFamilyId列,以便唯一地识别每个系列。

我正在尝试制定一个公式,将所有居住在同一地址的人的名字收集到一个单元格中 - 即填写E列(AllFirstNames)的名称。

A             B              C          D                    E
FirstName     SurnameName    Address    UniqueFamilyId       AllFirstNames
-------------------------------------------------------------------------------
Abe           Black          1 Elm Ave  :Black:1 Elm Ave:    Abe Jack 
Joe           Doe            7 Park Ln  :Doe:7 Park Lane:    Joe Harry Sam
Jack          Black          1 Elm Ave  :Black:1 Elm Ave:    Abe Jack
Bill          Doe            2 5th Ave  :Doe:2 5th Ave:      Bill
Harry         Doe            7 Park Ln  :Doe:7 Park Lane:    Joe Harry Sam
Sam           Doe            7 Park Ln  :Doe:7 Park Lane:    Joe Harry Sam

我怀疑vlookup和数组公式的混合可以解决问题,但如果我必须使用Excel VBA或Google Apps脚本,我不介意。你能帮我解决这个问题吗。

我猜这是找到D列(UniqueFamilyId)中所有值的某种形式 相同,然后使用vlookup获取名字,所有这些都在数组公式中,以便将它们全部收集起来。

P.S。我已经弄清楚如何计算每个地址的生活数量 - 公式只是

=COUNTIF(D$1:D$65536,D1)

但我希望收集所有这些名字,而不仅仅是一个计数。

2 个答案:

答案 0 :(得分:5)

在Google电子表格中,您可以像这样使用ArrayFormula:

=ArrayFormula(concatenate(rept(A:A&" ";D:D=D2)))

只需将其粘贴到单元格E2上,然后向下复制。

[编辑]

多玩一点,我知道可以在一个单元格(E2)上完成所有操作。即无需复制。当然,它更复杂:)但是你走了:

=ArrayFormula(transpose(split(concatenate(transpose(if(D2:D=transpose(D2:D);A2:A&" ";"")&if(row(D2:D)=rows(D2:D)+1;char(9);"")));char(9))))

答案 1 :(得分:4)

使用VBA功能可以在一个单元格中汇总您的匹配项。我已经多次使用下面的函数来连接一个值数组 - 这是内置函数CONCATENATE()无法做到的。

第1步:
按Alt + F11以在Excel中打开VBA编辑器窗格。插入一个新模块并粘贴此代码以获取自定义函数。

Public Function CCARRAY(rr As Variant, sep As String)
'rr is the range or array of values you want to concatenate.  sep is the delimiter.
Dim rra() As Variant
Dim out As String
Dim i As Integer

On Error GoTo EH
rra = rr
out = ""
i = 1

Do While i <= UBound(rra, 1)
    If rra(i, 1) <> False Then
        out = out & rra(i, 1) & sep
    End If
    i = i + 1
Loop
out = Left(out, Len(out) - Len(sep))
CCARRAY = out
Exit Function

EH:
rra = rr.Value
Resume Next

End Function

此功能允许您创建以逗号分隔的列表,以汇总您拥有的标签数据。

第2步:
在表格的E2中,粘贴以下公式,然后按 Ctrl + Shift + 输入。这将以数组公式的形式输入。

=CCARRAY(IF(D2=$D$2:$D$7,$A$2:$A$7)," ")

只需填写专栏即可。