10

我正在尝试在先名后姓的情况下进行 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。

4

2 回答 2

20

很多种方法:

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

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

在此处输入图像描述

如果没有,那么:

  1. 处理数字返回:

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

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

在此处输入图像描述


  1. 使用非数字返回

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

一个。辅助列:

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

=A1&B1

并复制列表

在此处输入图像描述

然后使用索引/匹配:

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

在此处输入图像描述

湾。数组公式:

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

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

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

在此处输入图像描述

如果您的数据集定期更改大小,我们可以通过添加更多 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. 在一个单元格中获得多个答案

如果您不想求和,或者返回值为文本并且有多个 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 函数进行动态化。

在此处输入图像描述

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

于 2017-02-27T18:59:46.870 回答
0

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


基于这个答案


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

脚步

  1. 将数据添加到Excel 结构化表格

表格

  1. 将此功能添加到模块

代码:

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
  1. 像这样调用函数:

调用函数

=lookupValues(TableName;E1;F1;E2;F2;E3)
于 2020-12-29T19:11:42.503 回答