提问人:Brad 提问时间:2/28/2017 最后编辑:Brad 更新时间:12/8/2021 访问量:5706
使用 2 列引用另一列的 Vlookup
Vlookup using 2 columns to reference another
问:
我正在尝试在先用姓氏后用姓氏的情况下进行 vlookup 以获得年龄。这将在 A 列中完成,然后在 B 列中完成。如果在 A 列中找到,请继续到 B 列,如果在 B 列中找到,则将年龄放在 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。
答:
多种方式:
如果有新的动态数组公式:
=FILTER(C:C,(A:A=J1)*(B:B=J2))
如果不是,那么:
- 处理号码返回:
如果您的返回值是数字并且匹配是唯一的(数据中只有一个 John Doe),或者如果存在多个,则要对返回值求和,则使用 SUMIFS 是最快的方法。
=SUMIFS(C:C,A:A,J1,B:B,J2)
- 使用非数字返回
如果返回值不是数字或有倍数,则有两种方法可以获取列表中的第一个匹配项:
一个。辅助列:
在第四列中输入以下公式:
=A1&B1
并向下复制列表
然后使用 INDEX/MATCH:
=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/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))
这将允许数据集增长或缩小,并且公式将仅循环访问具有数据的数据集,而不是完整列。
上述方法按“最佳-更好-良好”的顺序设置。
- 在一个单元格中获取多个答案
如果您不想求和,或者返回值是文本,并且有多个 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 函数使范围动态化。
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() 公式。
评论
这是在VBA
UDF
基于这个答案
这是一个通用的用户定义函数 (UDF)
步骤
- 将数据添加到 Excel 结构化表
- 将此函数添加到模块
法典:
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
- 调用函数如下:
=lookupValues(TableName;E1;F1;E2;F2;E3)
评论
=SUMIFS(C:C, A:A, J1, B:B, J2)
=A1&B1
=vlookup(J1&J2, C:C, 2, false)
table_array
C:D
C:C