Vlookup使用2列引用另一列

Bra*_*rad 6 excel excel-formula vlookup textjoin

我想在第一个姓氏的情况下做一个vlookup来获得一个年龄.这将在A列中完成,然后在B列中完成.如果在A列中找到,则继续到B列,如果在B列中找到,则将年龄放在来自C列的J3中,否则将"无"放入.

这是一个例子:

J1 = John
J2 = Doe
J3 = =VLOOKUP J1 & J2,A1:C50,3,FALSE)
Run Code Online (Sandbox Code Playgroud)

J3是我到目前为止所拥有的.我是否需要嵌套Vlookup来检查A列,然后是B列才能获得年龄?

以下是表列表的示例:

A     B    C
Jeff  Vel  80
John  Fly  25
Jake  Foo  20
John  Doe  55
Run Code Online (Sandbox Code Playgroud)

J3 = 55.

Sco*_*ner 13

很多种方法:

  1. 处理数字返回:

如果您的返回值是数字且匹配是唯一的(数据中只有一个John Doe),或者您希望在存在倍数时将返回值相加,则使用SUMIFS是最快的方法.

=SUMIFS(C:C,A:A,J1,B:B,J2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


  1. 使用非数字返回

如果返回值不是数字或有倍数,那么有两种方法可以获得列表中的第一个匹配项:

一个.帮助栏:

在第四栏中输入以下公式:

=A1&B1
Run Code Online (Sandbox Code Playgroud)

并复制列表

在此输入图像描述

然后使用INDEX/MATCH:

=INDEX(C:C,MATCH(J1&J2,D:D,0))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

湾 数组公式:

如果您不想或不能创建第四列,请使用数组类型公式:

=INDEX(C:C,AGGREGATE(15,6,ROW($A$1:$A$4)/(($A$1:$A$4=J1)*($B$1:$B$4=J2)),1))
Run Code Online (Sandbox Code Playgroud)

数组类型公式需要将数据大小限制为数据集.

在此输入图像描述

如果您的数据集定期更改大小,我们可以通过添加更多INDEX/MATCH来修改上面的动态,以返回包含数据的最后一个单元格:

=INDEX(C:C,AGGREGATE(15,6,ROW($A$1:INDEX($A:$A,MATCH("ZZZ",A:A)))/(($A$1:INDEX($A:$A,MATCH("ZZZ",A:A))=J1)*($B$1:INDEX($B:$B,MATCH("ZZZ",A:A))=J2)),1))
Run Code Online (Sandbox Code Playgroud)

这将允许数据集增长或缩小,并且公式将仅迭代具有数据而不是完整列的数据集.

上述方法按照Best-Better-Good的顺序设置.


  1. 在一个单元格中获得多个答案

如果您不想求和,或者返回值是文本,并且有多个John Doe实例,并且您希望在一个单元格中返回所有值,则:

一个.如果您有Office 365 Excel,则可以使用TEXTJOIN的数组形式:

=TEXTJOIN(",",TRUE,IF(($A$1:$A$4=J1)*($B$1:$B$4=J2),$C$1:$C$4,""))
Run Code Online (Sandbox Code Playgroud)

作为数组公式,需要在退出编辑模式时使用Ctrl-Shift-Enter而不是Enter来确认.如果正确完成,Excel将放置{}公式.

与上面的AGGREGATE公式一样,它需要限于数据集.使用上面的INDEX/MATCH函数也可以使范围动态化.

在此输入图像描述

湾 如果没有Office 365 Excel,则将此代码添加到附加到工作簿的模块:

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0

    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function
Run Code Online (Sandbox Code Playgroud)

然后使用如上所述的TEXTJOIN()公式.

  • 我真的很喜欢SUMIFS的使用。简单但创新。我学到了一些东西。 (3认同)