Vlookup 重复状态

Vlookup for duplicate status

我一直在寻找不同的方法来解决我的问题,无论是使用 vlookup、index、index /match,但我还没有弄清楚。

我正在尝试在同一行中列出同一公寓的相同共同租户,如图所示:

这是一个没有辅助列的方法:

要在单元格 B21 中获取“John”,您可以使用数组公式*,该公式将组合 A 列和 B 列,以便您可以同时匹配两个条件(使用“&”)。公式如下所示:

=INDEX($C:$C,MATCH($A21&B,$A:$A&$B:$B,0))

要在单元格 C21 中获取“Simon”,您只需复制前一个,因为美元符号将确保查找标准调整正确。

要在 D21 中获得“Alex”,这有点棘手,因为您要尝试获得第二场比赛。 this article 中详细介绍了获得第二个匹配项的方法。在这种情况下,它看起来像这样:

=INDEX($C:$C,SMALL(IF($A21&$D20=$A:$A&$B:$B,ROW($A:$A)-ROW($A)+1),2))

*:需要按Ctrl+Shift+Enter =29=](2010 年及更早版本)。

假设您的数据在 A2:C 列中?将右侧的列指定为重新排列的数据的接收者。在标题(第 1 行)中输入与“状态”列中使用的描述完全相同的描述。我在所有剩余的列中使用了列 D:H 和标题“Main”和“Co-Tenant”。这样,我有 4 列用于 Co-Tenants。您需要尽可能多的列,因为最多可能有 Co-Tenants。

现在在新 Main 列(在我的示例中为 D2)的第一个单元格中输入下面的公式,并将其复制到整个范围,在我的示例中 D2:H6。所有单元格都是相同的公式。

=IF(OFFSET($B2,COLUMN()-4,0)=D,OFFSET($B2,COLUMN()-4,1),"")

注意我公式中的4是你输入公式的列号。在我的测试中是 D 列,第四列)。如果您使用另一列,请将两次出现的 4 替换为您选择的列的编号。公式对 D$1 的引用也是如此。该单元格指定新 Main 列的标题。

现在 select 整个范围与公式(D2:H6 在我的测试中),复制并选择性粘贴 > 值。这将用它们生成的值替换所有公式。您现在可以删除列 B:C.

Select 整个范围(我还没有删除 B:C。所以对我来说是 A2:H6)然后单击 删除重复项 数据 选项卡上。为重复项指定 A 列。此操作将仅保留每个公寓 ID 的第一行,删除所有其他行,尤其是那些在应用公式后出现错误的行。如果您没有删除列 B:C 但它们现在肯定是多余的。

你说 ive been looking for different approaches ,所以这只是一个小建议,如果你使用的是 office365,那么你可以使用 filter function

公式如下:

=TRANSPOSE(FILTER($B:$B,$A:$A=D3))

一种VBA方法

Sub list()

    Dim wb As Workbook, ws As Worksheet
    Dim iRow As Long, iHeaderRow As Long
    Dim sApt As String, sStatus, sName As String

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")

    iRow = 4  'start
    sApt = CStr(ws.Cells(iRow, 1))
    Do While Len(sApt) > 0

        sStatus = ws.Cells(iRow, 2)
        sName = ws.Cells(iRow, 3)

        If Not dict.exists(sApt) Then
            dict.Add sApt, ""
        End If

        If LCase(sStatus) = "main" Then
            dict(sApt) = sName & dict(sApt) ' add to front
        Else
            dict(sApt) = dict(sApt) & ";" & sName ' add to back
        End If

        iRow = iRow + 1
        sApt = CStr(ws.Cells(iRow, 1))

    Loop

    ' result header
    iHeaderRow = iRow + 1
    ws.Cells(iHeaderRow, 1) = "Apt"
    ws.Cells(iHeaderRow, 2) = "Main"
    iRow = iRow + 2

    ' result table
    Dim k As Variant, ar As Variant, n As Integer, m As Integer
    For Each k In dict.keys
        ws.Cells(iRow, 1) = k
        ar = Split(dict(k), ";")
        n = UBound(ar)
        ws.Cells(iRow, 2).Resize(1, n + 1) = ar
        If n > m Then m = n ' max for n
        iRow = iRow + 1
    Next

    ' complete header row
    For n = 1 To m
        ws.Cells(iHeaderRow, n + 2) = "Co-tenant"
    Next
    MsgBox "Done"

End Sub