Excel formula 将公式更新为';搜索';下一个名称,如果第一个列出的名称结果为#N/A

Excel 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

我正在运行这个公式,它对单元格中第一个列出的名称运行良好。我想将公式更新为“搜索”下一个名称,如果第一个列出的名称结果为“N/A”,则执行Vlookup

  • 第一行包含:
    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是您的
    UserDepReport
    工作表的A列
  • ListValue
    UserDepReport
    工作表的C列
尝试下列数组公式之一,在公式栏中完成公式后,必须按Ctrl+Shift+Enter键,否则它们将无法正常工作。然后,只需将公式向下拖动,即可将其应用于各个方向

=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))