Excel formula 将公式更新为';搜索';下一个名称,如果第一个列出的名称结果为#N/A
我正在运行这个公式,它对单元格中第一个列出的名称运行良好。我想将公式更新为“搜索”下一个名称,如果第一个列出的名称结果为“N/A”,则执行VlookupExcel formula 将公式更新为';搜索';下一个名称,如果第一个列出的名称结果为#N/A,excel-formula,Excel Formula,我正在运行这个公式,它对单元格中第一个列出的名称运行良好。我想将公式更新为“搜索”下一个名称,如果第一个列出的名称结果为“N/A”,则执行Vlookup 第一行包含:Jane;厕所;大卫 第二行包含:Mary;莫莉;丹;托马斯 第三行包含:Lily;鸽子露西;迈克 您将需要迭代名称并测试每个名称,然后将一个正查找数组返回到索引,以返回响应数组,然后选择第一个。使用以下数组公式: =INDEX(INDEX(E:E,N(IF({1},MODE.MULT(IF(ISNUMBER(MATCH(TR
- 第一行包含:
Jane;厕所;大卫代码>
- 第二行包含:
Mary;莫莉;丹;托马斯代码>
- 第三行包含:
Lily;鸽子露西;迈克代码>
您将需要迭代名称并测试每个名称,然后将一个正查找数组返回到索引,以返回响应数组,然后选择第一个。使用以下数组公式:
=INDEX(INDEX(E:E,N(IF({1},MODE.MULT(IF(ISNUMBER(MATCH(TRIM(MID(SUBSTITUTE(A1,";",REPT(" ",999)),(ROW($ZZ$1:INDEX($ZZ:$ZZ,LEN(A1)-LEN(SUBSTITUTE(A1,";",""))))-1)*999+1,999)),D:D,0)),MATCH(TRIM(MID(SUBSTITUTE(A1,";",REPT(" ",999)),(ROW($ZZ$1:INDEX($ZZ:$ZZ,LEN(A1)-LEN(SUBSTITUTE(A1,";",""))))-1)*999+1,999)),D:D,0)*{1,1}))))),1)
作为数组公式,必须在退出编辑模式时使用Ctrl-Shift-Enter而不是Enter确认
这将根据A1中的顺序返回第一个匹配项
如果优先顺序是姓名列表(我照片中的D列),则可以使用更简单的公式:
=INDEX(E:E,AGGREGATE(15,7,ROW($D$1:$D$5)/(ISNUMBER(SEARCH("; "&$D$1:$D$5&";","; " &A1))),1))
注意B3和C3之间的不同返回:
我们还可以通过一个简单的UDF利用
vba.Split()
:
Function MYSPLIT(STR As String, del As String) As String()
MYSPLIT = Split(STR, del)
End Function
这允许使用较短的公式:
=INDEX(INDEX(E:E,N(IF({1},MODE.MULT(IF(ISNUMBER(MATCH(TRIM(MYSPLIT(A1,";")),D:D,0)),MATCH(TRIM(MYSPLIT(A1,";")),D:D,0)*{1;1}))))),1)
仍然是必须使用Ctrl-Shift-Enter键的数组公式。将代码放入工作簿附带的模块中。假设您有以下命名范围:
- ListName是您的
工作表的A列李>UserDepReport
- ListValue是
工作表的C列UserDepReport
=INDEX(ListValue,MATCH(TRIM(MID(SUBSTITUTE(MID(D2,MIN(IFERROR(SEARCH("; "&ListName&";","; "&D2),LEN(D2))),LEN(D2)),";",REPT(" ",100)),1,100)),ListName,0))
更换D2
,以适合您的实际情况
逻辑是使用SEARCH函数找出字符串中是否存在数据表中的任何名称,然后使用MIN+IFERROR函数返回第一个有效名称,然后使用TRIM+MID+REPT函数提取名称,最后使用INDEX+MATCH返回相应的值
或
=索引(ListValue,MATCH(TRIM(MID(替换为D2,;”,REPT(“,100)),(MIN(IFERROR(匹配为ListName,FILTERXML(“&TRIM(替换为左(D2,LEN(D2)-1),”;“,”)&“t/s”),0,LEN(D2))-1)*100100)),ListName,0))
更换D2
,以适合您的实际情况
此公式的逻辑与第一个公式类似,而此公式使用FILTERXML提取数组中字符串中的所有名称,然后使用MATCH函数确定字符串中是否存在数据表中的任何名称,然后使用MIN+IFERROR函数返回第一个有效名称,其余与第一个函数相同
如果你有任何问题,请告诉我。干杯:)请提供一个预期结果的示例。如果两个名称返回一个值,您是否只想要第一个值?如果Vlookup在UserDepReport表中找不到“Jane”,则应查找“John”,如果找不到“John”,则在UserDepReport中查找“David”。如果在单元格的UserDeproport中未找到所有名称,则应返回#N/A。单元格中的最大名称数是多少?最大名称数从2到15不等。
=INDEX(ListValue,MATCH(TRIM(MID(SUBSTITUTE(MID(D2,MIN(IFERROR(SEARCH("; "&ListName&";","; "&D2),LEN(D2))),LEN(D2)),";",REPT(" ",100)),1,100)),ListName,0))
=INDEX(ListValue,MATCH(TRIM(MID(SUBSTITUTE(D2,";",REPT(" ",100)),(MIN(IFERROR(MATCH(ListName,FILTERXML("<t><s>"&TRIM(SUBSTITUTE(LEFT(D2,LEN(D2)-1),";","</s><s>"))&"</s></t>","t/s"),0),LEN(D2)))-1)*100,100)),ListName,0))