Vlookup使用2列引用另一列

时间:2017-02-27 18:05:55

标签: 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)

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

以下是表格列表的示例:

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

J3 = 55。

2 个答案:

答案 0 :(得分:9)

很多方式:

  1. 处理数字返回:
  2. 如果您的返回值是数字且匹配是唯一的(数据中只有一个John Doe),或者您想要在有倍数的情况下对返回值求和,那么使用SUMIFS是最快的方法。

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

    enter image description here

    1. 使用非数字返回
    2. 如果返回值不是数字或有倍数,则有两种方法可以获得列表中的第一个匹配项:

      一个。帮助栏:

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

      =A1&B1
      

      并复制列表

      enter image description here

      然后使用INDEX / MATCH:

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

      enter image description here

      湾数组公式:

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

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

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

      enter image description here

      如果您的数据集定期更改大小,我们可以通过添加更多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))
      

      这将允许数据集增长或缩小,公式将只遍历具有数据而不是完整列的那些。

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

      1. 在一个单元格中获得多个答案
      2. 如果你不想求和,或者返回值是文本,并且有多个John Doe实例,并且你想要在一个单元格中返回所有值,那么:

        一个。如果您有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会将{}放在公式周围。

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

        enter image description here

        湾如果没有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()公式。

答案 1 :(得分:0)

这是在 \x98\x99\x9a\x9b\x9e\xe9\xe7\xe0\xe3\xde 中使用 VBA 的替代方法


基于this answer


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

步骤

  1. 将您的数据添加到 Excel structured table

Excel table

  1. 将此函数添加到模块中

代码:

UDF
  1. 像这样调用函数:

Call function

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