5

我有一个如下所示的电子表格:

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 来获取名字,所有这些都在一个数组公式中将它们全部收集起来。

PS我已经计算出如何计算每个地址有多少人 - 公式很简单

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

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

4

2 回答 2

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))))
于 2012-04-20T12:06:03.247 回答
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+ Enter。这会将其作为数组公式输入。

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

只需填写该列,就可以了。

于 2012-04-19T14:07:40.020 回答