Excel 使用索引匹配使用多个非精确条件进行查找-查找最符合conedition的最近值时遇到问题

Excel 使用索引匹配使用多个非精确条件进行查找-查找最符合conedition的最近值时遇到问题,excel,excel-formula,Excel,Excel Formula,我正在尝试使用索引匹配使用多个不精确的条件进行查找。 公式如下所示: =索引(C314:C318;匹配(1;(D314:D318>=G313)*(E314:E318>=G314);0)) 标准为:大于或等于数量X 公式可以很好地工作,但是当使用一长串值时,它不会找到最佳匹配值,而是找到与条件匹配的第一个值 比如说 条件1:代码“查找代码等于20555516” 条件2为:数值“发现值等于或大于77” 条件3是:按字母顺序“查找等于或大于H的字母” 在一个有很多值的大型数据集中,它只会找到符合此标准

我正在尝试使用索引匹配使用多个不精确的条件进行查找。 公式如下所示:

=索引(C314:C318;匹配(1;(D314:D318>=G313)*(E314:E318>=G314);0))

标准为:大于或等于数量X

公式可以很好地工作,但是当使用一长串值时,它不会找到最佳匹配值,而是找到与条件匹配的第一个值

比如说

条件1:代码“查找代码等于20555516” 条件2为:数值“发现值等于或大于77” 条件3是:按字母顺序“查找等于或大于H的字母”

在一个有很多值的大型数据集中,它只会找到符合此标准的次优值。满足该条件的第一个值是“80”和“R”,然而,在我的数据集中的值之后,在下面的地方,更好地满足那些带有“78”和“I”的标准。我想这里的问题很清楚

我如何调整我的公式来寻找那些更适合我的条件的值

数据集表如下所示:


公式应该返回最佳加工产品的名称“A、B、C、D、E”。

这可以通过更聪明的方法实现,但以下方法对我有效:

G2
中的公式,在上面的示例数据之后返回具有最佳匹配的行:

=INDEX(A2:A6,MATCH(SMALL(IF(B2:B6-E2>-1,B2:B6-E2+IF(CODE(C2:C6)-CODE(F2)>-1,CODE(C2:C6)-CODE(F2),""),""),1),IF(B2:B6-E2>-1,B2:B6-E2+IF(CODE(C2:C6)-CODE(F2)>-1,CODE(C2:C6)-CODE(F2),""),""),0))
注意通过Ctrl+Shift+Enter输入数组公式


当没有条件匹配时,它将返回一个错误,您可以通过
IFERROR()

捕获。我使用了一个名为
helper
的助手列,使用以下公式将
条件2
中的字母按字母顺序排列(将其向下拖动以应用于所有行):

将上述公式中的命名范围替换为工作表中的实际范围

替换为
作为所有公式中的分隔符,以适合您的系统

编辑#2

基于新的场景,只要查找值是一个数字(
EAN
),就可以通过聚合函数解决该问题

上面示例中单元格
J2
中的公式是:

=AGGREGATE(15,6,EAN/((DIMENSION=F2)/(LOAD_INDEX>=G2)/(SPEED_INDEX>=H2)),1)
请注意,以下是所有命名范围,需要替换为工作簿上的实际范围:

  • 维度
    B2:B8
  • 负载指数
    C2:C8
  • 速度指数
    D2:D8
  • EAN
    A2:A8
如果不想显示错误
#NUM
对于不匹配的结果,可以使用IFERROR返回空白单元格,如我的示例中的单元格
J3
所示。公式是:

=IFERROR(AGGREGATE(15,6,EAN/((DIMENSION=F3)/(LOAD_INDEX>=G3)/(SPEED_INDEX>=H3)),1),"")
编辑#3

请使用以下数组公式(需要通过按Ctrl+Shift+Enter进行确认)在
助手
列的帮助下查找
负载索引
速度索引
的最接近匹配项

{=INDEX(EAN,MATCH(AGGREGATE(15,6,Helper/((LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)))=AGGREGATE(15,6,LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)),1)),1),Helper/((LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)))=AGGREGATE(15,6,LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)),1)),0))}

逻辑是首先查找与
负荷指数
最接近的匹配项,然后从与
负荷指数
最接近的范围中查找与
限速
最接近的匹配项

如果您不想显示
#NUM,请再试一次错误如果没有匹配结果,可以使用IFERROR返回所需结果


如果有任何问题,请告诉我。干杯:)

聪明的解决方案+1我唯一想更改的是将
IF
语句的第三个参数更改为一个非常大的数字(例如
1E+300
),而不是一个空格。这样可以避免数组中潜在的
#值
错误。可能没关系,但我总是希望尽可能避免数组中的错误。好的,我会试试。是否也可以在两个搜索字段中输入想要的值“77”和“H”,而不是将它们写入公式?@contiDevTeam,检查编辑后的答案。这取决于你用“;”替换“;”@JvdV LOL而不是,vs;再次发布!您在这里发现的是
VLOOKUP
/
HLOOKUP
MATCH
范围/不精确查找依赖于排序的列表。您好,可以将C2写入第一个公式吗?我总是得到“1”嘿,我试着在公式的开头加上第三个条件。该条件的工作方式应与其他两个条件相同,但它应查找“等于”的值,而不是“等于或大于”。有没有可能把这个加入你的配方中?示例:条件1(相等=):“2056516”,条件2(相等或大于):“107”,条件3(按字母顺序,相等或大于):“T”。?嗨,特里,解决方案不错,谢谢。唯一仍然不起作用的是,公式没有寻找最接近的匹配项。假设我正在寻找负载索引“82”->,那么公式会在列表中找到“第一个匹配项”,可以是“88”,但列表中的负载索引远低于“84”,甚至等于“82”。但其余的都像charme:)谢谢。干杯。@contiDevTeam感谢您的调试。我已经更新了我的答案,请参见编辑#3。如果my或JvdV的解决方案对您有效,您可以单击“向上投票”和“向下投票”按钮下的勾号,将答案标记为查询的解决方案。
=IFERROR(AGGREGATE(15,6,EAN/((DIMENSION=F3)/(LOAD_INDEX>=G3)/(SPEED_INDEX>=H3)),1),"")
{=INDEX(EAN,MATCH(AGGREGATE(15,6,Helper/((LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)))=AGGREGATE(15,6,LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)),1)),1),Helper/((LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)))=AGGREGATE(15,6,LOAD_INDEX/((DIMENSION=G2)/(LOAD_INDEX>=H2)/(SPEED_INDEX>=I2)),1)),0))}