Excel-如何通过vlookup返回多个值?


18

我正在寻找使用Excel查找并返回给定键的多个参考值。VLookup所做的事情与我需要的非常相似-但只返回一个匹配项。

我假设它将涉及数组返回和处理方法,尽管我以前没有处理过。作为解决方案的一部分,一些谷歌搜索开始依靠if([lookuparray] = [value],row [lookuparray])-尽管我无法让它返回单个匹配项...

例如,如果我有此参考数据:

Adam    Red
Adam    Green
Adam    Blue
Bob     Red
Bob     Yellow
Bob     Green
Carl    Red 

我正在尝试获取右侧的多个返回值。(如果可能,请用逗号分隔)

Red      Adam, Bob, Carl
Green    Adam, Bob
Blue     Adam
Yellow   Bob

(我已经在左侧有了键值-无需提取那些值)

在这种情况下,有关如何处理多个值的任何帮助都将受到赞赏。谢谢。

Answers:


13

假设您要使用所述的公式方法(不使用VLOOKUP,但仍使用公式),这是我如何布置数据的方法:

数据布局

然后,在单元格C12中使用以下公式:

=INDEX($C$2:$C$8, SMALL(IF($B12=$B$2:$B$8, ROW($B$2:$B$8)-MIN(ROW($B$2:$B$8))+1, ""), 1))

这是一个数组公式,因此在将其复制并粘贴到单元格后,您必须单击它Ctrl+Shift+Enter。然后,我将其拖动到右侧和底部。

如果没有剩余值,则会给出#NUM!错误,我在上载的图像示例中给出了黄色示例。

我认为如果您有大量行,则VBA /宏方法将是更好的解决方案。


对于那些希望对检索到的值求和(顺序无关紧要)的人,将IF与数组一起使用更简单:=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
Aralox

我尝试了这个公式,但是在上下拖动后得到的输出仅返回Adam和Bob-我做错了吗?在此处查看屏幕快照snag.gy/qW7UKM.jpg
ziggy

@ziggy您是否按了Ctrl + Shift + Enter键?

5
  1. 交换列,以使颜色在A列中,名称在B列中,然后按颜色排序。

  2. C2中的公式(将其复制到列下方):= IF(A2 <> A1,B2,C1&“,”&B2)

  3. D2中的公式(将其复制到列下方):= A2 <> A3

  4. 在D列上过滤“ TRUE”以获得所需的结果。见下文:

在此处输入图片说明


直到您可以使用“&”运算符代替笨拙的CONCATENATE()公式。谢谢!
bpcookson

3

如果要使用公式方法,则将结果放在单独的单元格中要容易得多,因此,假设您的第一个表是A2:B8,并且颜色再次列在D2:D5中。在E2中尝试此公式

=IFERROR(INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))),"")

与确认,CTRL+SHIFT+ENTER并前后复制。当比赛用完时,您将获得空白。

公式假定使用Excel 2007或更高版本-如果使用较早版本,则可以使用COUNTIF而不是IFERROR,即

=IF(COLUMNS($E2:E2)>COUNTIF($B$2:$B$8,$D2),"",INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))))


3

这是为您提供的VBA解决方案。首先,结果如下所示:

屏幕截图

这是代码:

Option Explicit
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String

    Dim s As String 'Results placeholder
    Dim sTmp As String  'Cell value placeholder
    Dim r As Long   'Row
    Dim c As Long   'Column
    Const strDelimiter = "|||"  'Makes InStr more robust

    s = strDelimiter
    For r = 1 To lookupRange.Rows.Count
        For c = 1 To lookupRange.Columns.Count
            If lookupRange.Cells(r, c).Value = lookupValue Then
                'I know it's weird to use offset but it works even if the two ranges
                'are of different sizes and it's the same way that SUMIF works
                sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
                If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
                    s = s & sTmp & strDelimiter
                End If
            End If
        Next
    Next

    'Now make it look like CSV
    s = Replace(s, strDelimiter, ",")
    If Left(s, 1) = "," Then s = Mid(s, 2)
    If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)

    LookupCSVResults = s 'Return the function

End Function
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.