我希望使用 Excel 查找并返回给定键的多个参考值。查找所做的事情和我需要的非常相似-但只返回一个匹配。
我猜想这会涉及数组返回和处理方法,尽管我之前没有处理过这些方法。一些谷歌搜索开始依赖 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
(我已经有了左边的键值——不需要拉出这些值)
对于如何处理此上下文中的多个值,任何帮助都将不胜感激。谢谢。
答案1
假设您想要如上所述的公式方法(不使用 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/Macro 方法将是更好的解决方案。
答案2
以下是 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
答案3
交换列,使得颜色在 A 列,名称在 B 列,然后按颜色排序。
C2 中的公式(将其复制到列下):=IF(A2<>A1,B2,C1 & ", " & B2)
D2 中的公式(将其复制到列下):=A2<>A3
在 D 列中筛选“TRUE”以获得所需结果。如下所示:
答案4
如果您想要使用公式方法,那么在单独的单元格中获取结果要简单得多,因此我们假设您的第一个表格是 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))))