Excel Vlookup使用两列引用另一列

Excel Vlookup使用两列引用另一列,excel,excel-formula,vlookup,textjoin,Excel,Excel Formula,Vlookup,Textjoin,我正试图在先姓后名的情况下做一个vlookup来确定年龄。这将在A列中完成,然后在B列中完成。如果在A列中找到,则继续在B列中找到,如果在B列中找到,则在J3中输入来自C列的年龄,否则输入“无” 以下是一个例子: J1 = John J2 = Doe J3 = =VLOOKUP J1 & J2,A1:C50,3,FALSE) J3是我目前所拥有的。我是否需要嵌套一个Vlookup来检查列a,然后检查列B以获得年龄 以下是表格列表的示例: A B C Jeff Vel

我正试图在先姓后名的情况下做一个vlookup来确定年龄。这将在A列中完成,然后在B列中完成。如果在A列中找到,则继续在B列中找到,如果在B列中找到,则在J3中输入来自C列的年龄,否则输入“无”

以下是一个例子:

J1 = John
J2 = Doe
J3 = =VLOOKUP J1 & J2,A1:C50,3,FALSE)
J3是我目前所拥有的。我是否需要嵌套一个Vlookup来检查列a,然后检查列B以获得年龄

以下是表格列表的示例:

A     B    C
Jeff  Vel  80
John  Fly  25
Jake  Foo  20
John  Doe  55
J3=55。

多种方式:

如果有新的动态数组公式:

=FILTER(C:C,(A:A=J1)*(B:B=J2))

如果没有,则:

  • 处理数字返回:
  • 如果您的返回值是数字,并且匹配是唯一的(数据中只有一个John Doe),或者如果有倍数,您希望对返回值求和,那么使用SUMIFS是最快的方法

    =SUMIFS(C:C,A:A,J1,B:B,J2)
    


  • 具有非数字返回
  • 如果返回值不是数字或存在倍数,则有两种方法可获得列表中的第一个匹配项:

    a。辅助列:

    在第四栏中提出以下公式:

    =A1&B1
    
    把名单抄下来

    然后使用索引/匹配:

    =INDEX(C:C,MATCH(J1&J2,D:D,0))
    

    b。数组公式:

    如果不需要或无法创建第四列,请使用数组类型公式:

    =INDEX(C:C,AGGREGATE(15,6,ROW($A$1:$A$4)/(($A$1:$A$4=J1)*($B$1:$B$4=J2)),1))
    
    数组类型公式需要将数据大小限制为数据集

    如果您的数据集定期更改大小,我们可以通过添加更多索引/匹配来将上述内容修改为动态,以返回最后一个包含数据的单元格:

    =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))
    
    这将允许数据集增长或收缩,并且公式将只迭代那些有数据的数据集,而不是完整的列

    上述方法按最佳-较好-良好顺序设置


  • 在一个单元格中获取多个答案
  • 如果不希望求和,或者返回值为文本,并且存在多个John Doe实例,并且希望在一个单元格中返回所有值,则:

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

    =TEXTJOIN(",",TRUE,IF(($A$1:$A$4=J1)*($B$1:$B$4=J2),$C$1:$C$4,""))
    
    作为一个数组公式,在退出编辑模式时,需要使用Ctrl-Shift-Enter而不是Enter进行确认。如果操作正确,Excel将在公式周围放置
    {}

    与上面的聚合公式一样,它需要限于数据集。还可以使用上述索引/匹配函数动态设置范围

    b。如果没有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
    
    函数TEXTJOIN(delim作为字符串,skipblank作为布尔值,arr)
    长得一样暗
    尺寸c与长度相同
    Dim arr2()
    调暗t的长度,y的长度
    t=-1
    y=-1
    如果TypeName(arr)=“范围”,则
    arr2=arr.值
    其他的
    arr2=arr
    如果结束
    出错时继续下一步
    t=UBound(arr2,2)
    y=UBound(arr2,1)
    错误转到0
    如果t>=0且y>=0,则
    对于c=LBound(arr2,1)到UBound(arr2,1)
    对于d=LBound(arr2,1)到UBound(arr2,2)
    如果arr2(c,d)“”或不是skipblank,则
    TEXTJOIN=TEXTJOIN&arr2(c,d)&delim
    如果结束
    下一个d
    下一个c
    其他的
    对于c=LBound(arr2)到UBound(arr2)
    如果arr2(c)“”或不是skipblank,则
    TEXTJOIN=TEXTJOIN&arr2(c)&delim
    如果结束
    下一个c
    如果结束
    TEXTJOIN=Left(TEXTJOIN,Len(TEXTJOIN)-Len(delim))
    端函数
    

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

    这是在
    UDF中使用
    VBA
    的替代方法


    基于


    这是一个通用的用户定义函数(UDF)

    台阶
  • 将您的数据添加到
  • 将此函数添加到模块中
  • 代码:

    Public Function lookupValues(ByVal table As Range, ByVal criteria1_header As String, ByVal lookup_criteria1 As String, ByVal criteria2_header As String, ByVal lookup_criteria2 As String, ByVal return_header As String) As Variant
           
        On Error GoTo CleanFail
        
        ' Get criteria 1 column number from headers
        Dim criteria1Column As Long
        criteria1Column = Application.Match(criteria1_header, table.ListObject.HeaderRowRange, False)
        
        ' Get criteria 2 column number from headers
        Dim criteria2Column As Long
        criteria2Column = Application.Match(criteria2_header, table.ListObject.HeaderRowRange, False)
        
        ' Get value column number from headers according to function parameter
        Dim returnColumn As Long
        returnColumn = Application.Match(return_header, table.ListObject.HeaderRowRange, False)
        
        
        ' Get criteria 1 column values into 1d array
        Dim criteria1Values As Variant
        criteria1Values = WorksheetFunction.Transpose(Application.Index(table.Columns(criteria1Column), 0, 1))
        
        ' Get criteria 2 column values into 1d array
        Dim criteria2Values As Variant
        criteria2Values = WorksheetFunction.Transpose(Application.Index(table.Columns(criteria2Column), 0, 1))
        
        ' Define and redimension an array to hold the concatenated criteria 1 and criteria 2 values
        Dim criteria1_2Values() As Variant
        ReDim criteria1_2Values(1 To UBound(criteria1Values))
        
        ' Concatenate the criteria 1 and criteria 2 values and store them in an array
        Dim counter As Long
        For counter = 1 To UBound(criteria1Values)
            criteria1_2Values(counter) = criteria1Values(counter) & "|" & criteria2Values(counter)
        Next counter
        
        ' Get the matching row according to lookup values
        Dim resultRow As Variant
        resultRow = Application.Match(lookup_criteria1 & "|" & lookup_criteria2, criteria1_2Values, False)
        
        ' Get the result value according to the value column number
        Dim result As Variant
        result = Application.Index(table.Columns(returnColumn), resultRow)
        
        ' Return the value
    CleanExit:
        lookupValues = result
        Exit Function
        
    CleanFail:
        result = "Check function parameters"
        GoTo CleanExit
    End Function
    
  • 按如下方式调用函数:

  • 由于您正在从列表中查找一个数字,因此可以使用
    =SUMIFS(C:C,a:a,J1,B:B,J2)
    假设您的名字是唯一的。您还可以创建第三列来连接这些名称,然后在此列上进行查找。将C作为新列C1插入(并向下复制)
    =A1和B1
    。然后在J3
    =vlookup(J1&J2,C:C,2,false)
    中。请参阅@Jeeped why not Mjölnir此线程?与其依赖我回来发布后续评论来修复它,不如为OP提供一些指导,@callumDA。Brad,我的vlookup将失败,因为
    table_array
    参数应该是
    C:D
    而不是
    C:C
    @ScottCraner-我指向的链接是这种情况下最好的例子之一,但没有神奇的独角兽屁。你不能通过指向一个没有神奇独角兽屁的答案来重复一个问题,我不想做比OP更多的研究。我真的很喜欢SUMIFS的使用。简单而创新。我学到了一些东西。
    =lookupValues(TableName;E1;F1;E2;F2;E3)