广泛嵌套的 IF、ISNUMBER、MATCH

广泛嵌套的 IF、ISNUMBER、MATCH
=
IF(ISNUMBER(MATCH(A26;B$14#;0));A26;
IF(ISNUMBER(MATCH(A$36;B$14#;0));IF(ISNUMBER(MATCH(A$36;B$26:B26;0));

IF(ISNUMBER(MATCH(A$37;B$14#;0));IF(ISNUMBER(MATCH(A$37;B$26:B26;0));

IF(ISNUMBER(MATCH(A$38;B$14#;0));IF(ISNUMBER(MATCH(A$38;B$26:B26;0));

IF(ISNUMBER(MATCH(A$39;B$14#;0));IF(ISNUMBER(MATCH(A$39;B$26:B26;0));
0;A$39);A$38);A$37);A$36))))))

通过这个嵌套的 if(以及更多),我本质上是想看看第一个数字输入(A26)是否在列表(B$14#)内。如果它不在该列表中,我想用其中一个“填充”数字(A$36、A$37、A$38、A$39)替换它

但当我们浏览列表时,我不想重复使用填充数字。A$36 应该只使用一次,因此它应该在新列表如果已经被使用则创建。ISNUMBER(MATCH(A$36;$26:B26;0))

如果该数字存在于该列表中,则应转到下一个“填充数字”A$37,依此类推。目前,如果初始数字 (A26) 存在于列表中,则此公式将适用于所有初始数字 (A26),但当它应该从填充数字中获取时,将返回“FALSE”。

这仅仅是因为我放错了括号吗?

答案1

问题在于,你做的与你想要做的正好相反。要达到预期效果,公式应该是:

=IF(NOT(ISNUMBER(MATCH(A26,B$14#,0))), A26,
 IF(NOT(ISNUMBER(MATCH(A$36,B$14#,0))),A$36,
 IF(NOT(ISNUMBER(MATCH(A$37,B$14#,0))),A$37,
 IF(NOT(ISNUMBER(MATCH(A$38,B$14#,0))),A$38,
 IF(NOT(ISNUMBER(MATCH(A$39,B$14#,0))),A$39,0)))))

您进行的基本测试是检查是否MATCH()有数字结果,表明该数字存在于 B14# 中。如果是这样,您想继续测试占位符。但您没有:您的成功结果是使用 A26 中的数字,但是……success =“数字在列表中,因此不应该是结果”……不幸的是。我对测试进行了修改,NOT()因此结果是相反的。现在 TRUE 表示它不在列表中,因此 TRUE 的结果可以是 A26 值。后续测试也是如此。

第 1 行:测试 A26 是否存在于 B14# 中;如果不存在则返回 A26。
第 2 行:测试 A36 是否存在于 B14# 中;如果不存在则返回 A36。
第 3 行,依此类推:按顺序对其他每个占位符进行相同的测试。在第一个成功(不存在)的占位符处停止并返回它。

最后,如果 A26 值和所有占位符都在列表中,它将返回 0(看起来像您所希望的那样)。

如果工作内容复杂或者几乎成功,我通常会尝试使用尽可能接近某人的工作,认为它比一组大的更改更符合他们的喜好和经验。

然而,这不仅有前面提到的问题,还有另一个问题。请注意,你IF()每行有两个测试,而我只有一个。你的方法本质上是每行都说明了If this test is TRUE then if this test is TRUE哪些相当复杂的事情,以及以与需要相反的方式使用结果。IF()每行中的额外子句必须删除。

然而,如果你愿意改变方法,一个小小的改变就会更清晰易懂,从而更容易维护。再做一次小小的改变应该会让它更容易理解,从而更容易维护。

您可以使用ISERROR()代替NOT(ISNUMBER())。这样更直接,而且作为单一函数,更容易理解。

第二个变化是从 改为IF()IFS()列出一长串条件时,这样做会更加清晰。每个条件都可以放在一行中,因此可以更清楚地了解如何添加条件,而且由于它们似乎不会相互混淆,因此每个条件的完整含义和用法都更加清晰。您可以使用 127 个条件,而只能嵌套 64 个条件IF()。它看起来像:

=IFS(ISERROR(MATCH(A26,B$14#,0)),A26,
     ISERROR(MATCH(A36,B$14#,0)),A36,
     ISERROR(MATCH(A37,B$14#,0)),A37,
     ISERROR(MATCH(A38,B$14#,0)),A38,
     ISERROR(MATCH(A39,B$14#,0)),A39,
     TRUE,0)

相关内容