我迫切需要转换这个XLOOKUP
=XLOOKUP(D10;XLOOKUP(D8;D12:G12;D14:G24;;-1);C14:C24;;-1)
到 INDEX MATCH 或无需 O365 即可运行的程序。工作截止日期快到了,我无法让它工作。
答案1
=INDEX(C14:C24, IFERROR( MATCH(D10, INDEX(D14:G24,, IFERROR( MATCH(D8,D12:G12,0), MATCH(D8,D12:G12,1) )),0), MATCH(D10, INDEX(D14:G24,, IFERROR( MATCH(D8,D12:G12,0), MATCH(D8,D12:G12,1) )),1) ))
你想要的很简单,但有一个例外。对于简单的部分,XLOOKUP()
它基于技术INDEX/MATCH
,因此通常可以完美转换。你的复杂之处在于水平查找标题,然后使用它来查找 C 列中的值。不过,这是标准的东西。任何写这个的人都可以轻松地写另一个。
因此,我认为您的块有一个例外: 的 match_mode 参数XLOOKUP()
,末尾为“-1”。 转换为 的地方是 match_type 参数,其MATCH()
类型略有不同。XLOOKUP()
相关值为<=
、和,=
而使用(小于 ONLY)、 和。>=
MATCH()
"<"
=
>
可能有很多方法可以解决这个问题,但我在上面的公式中使用了一种非常简单的“这个或那个”方法,并IFERROR()
辨别使用哪种方法,因为如果一种方法失败了,它就会在IFERROR()
这里出错,从而产生自然结果。
该公式首先查找与 D8 完全匹配的匹配项,如果成功,则将其向前馈送。如果失败,则查找小于匹配项,实际上返回的不只是小于匹配项或第一个匹配项,而是最接近的匹配项,而不会超过一个匹配项。这满足了匹配XLOOKUP()
行为的需求。
第二次使用时的情况MATCH()
和您的原始公式想要的情况是一样的<=
。
遗憾的是,这一Xxxx()
系列函数同时出现,并且XMATCH()
使用相同的 match_mode 参数XLOOKUP()
。但如果一个函数没有其中一个,另一个函数也没有另一个,那么...
因此,它看起来不太优雅,而且有点笨重,但它确实有用。而且它里面没有任何东西不能在至少 2007 年的版本中运行,当时IFERROR()
它刚刚开始工作。在此之下,只需将精确匹配包装在 中ISERROR()
并将其作为 中的测试IF()
。使用不精确匹配尝试作为第二个ISERROR()
参数( 为 TRUE,因为它确实出错了)并使用精确匹配作为第三个参数( 为ISERROR()
FALSE,因此 为IF()
FALSE)。ISERROR()
将带您至少进入 Excel for Windows 2 的版本,因为我从那里开始使用 Excel,这是我很早就学到的东西。
不过,当然还有其他几种方法可以做到这一点。但这种方法有效,而且你的时间很短,所以……需要考虑一下。