Excel Vlookup使用两列引用另一列
我正试图在先姓后名的情况下做一个vlookup来确定年龄。这将在A列中完成,然后在B列中完成。如果在A列中找到,则继续在B列中找到,如果在B列中找到,则在J3中输入来自C列的年龄,否则输入“无” 以下是一个例子: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
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))
如果没有,则:
=SUMIFS(C:C,A:A,J1,B:B,J2)
=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))
这将允许数据集增长或收缩,并且公式将只迭代那些有数据的数据集,而不是完整的列
上述方法按最佳-较好-良好顺序设置
=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)