IF、And 或公式的参数过多

IF、And 或公式的参数过多

我需要一些帮助,这已经困扰我好几个星期了。此声明用于确定订单项是否仍处于打开状态、已关闭状态或需要重新提交。它显示为“错误”或参数过多。有人可以查看并告诉我我的错误在哪里吗?非常感谢。

=IF(AND(G231="FIO",N231>0),"C"," "),=IF(OR(G231="DA",G231="CR",G231="DA/CR"),IF(AND(N231>0,P231=0),"O",IF(AND(N231>0,P231>0),IF(OR(O231="A",O231="AN",O231="B"),"C",IF(OR(O231="C",O231="E",O231="G",O321="X"),"R"," "),=IF(OR(G231="GA",G231="DA/GA"),IF(AND(N231>0,T231=0),"O",IF(AND(N231>0,T231>0),IF(OR(S231="A",S231="AN",S231="B"),"C",IF(OR(S231="C",S231="E",S231="G",S321="X"),"R"," ")))))

答案1

首先删除位于=逗号之后和单词之前的IF

这是一个完整的公式:

=IF(AND(G231="FIO",N231>0),"C"," ")

它说“如果 G231 是 FIO 并且 N231 大于 0,则返回 C,否则返回空格”。

您不能,=IF在同一个公式中遵循该公式。

...),=IF...

无论哪里有这种东西,你都需要把它去除,然后从头开始重新思考。

尝试用通俗易懂的语言写出来。

  • 如果 G231 是 FIO 且 N231 大于零,则返回 C,否则:
  • 如果 G231 是 DA、CR 或 DA/CR,则:
  • 如果 N231 大于零并且 P231 为 0,则返回零,否则:
  • 如果(...“等

如果您写下您正在做的事情,您可能会发现最后写出公式会更容易。

由于不完全清楚您想要实现的目标,恐怕我无法提供除上述内容和以下建议之外的更多建议:

如果您的 Excel 版本支持 IFS 函数,您会发现它比大量嵌套的 IF 函数更容易使用。

Microsoft 支持 - IFS 函数

答案2

就像 Flex 在他的回答中所说的那样,公式中存在一个相当深的逻辑缺陷,这违反了 excel 函数的本质。我想在他的回答的基础上提供一些关于如何构建一组复杂条件的见解,这些条件不仅可以用于这个问题,还可以用于其他问题。然后我将使用其中的一些技巧来说明你的公式中存在的问题。

1. 如果您的 Excel 版本可用,请使用 LET 函数创建更易读的复杂函数

将 LET 函数与 Alt-Enter 组合使用可创建多行公式,从而大大简化复杂性。使用 LET 函数后,您的原始函数将变为:

=LET(
condA, AND(G231="FIO",N231>0),
condB, OR(G231="DA",G231="CR",G231="DA/CR"),
condC, AND(N231>0,P231=0),
condD, AND(N231>0,P231>0),
condE, OR(O231="A",O231="AN",O231="B"),
condF, OR(O231="C",O231="E",O231="G",O321="X"),
condG, OR(G231="GA",G231="DA/GA"),
condH, AND(N231>0,T231=0),
condI, AND(N231>0,T231>0),
condJ, OR(S231="A",S231="AN",S231="B"),
condK, OR(S231="C",S231="E",S231="G",S321="X"),
IF(condA,"C"," "),
=IF(condB,IF(condC,"O",IF(condD,IF(condE,"C",IF(condF,"R"," "),
=IF(condG,IF(condH,"O",IF(condI,IF(condJ,"C",IF(condK,"R"," "))))
)

这仍然不是一个有效的公式,但我们已经将条件的复杂性与逻辑分开,这样就更容易专注于 IF 语句。现在更容易看出你哪里出错了。

2. 实际上,你在一个单元格中同时运行了三个不相关的公式,这是行不通的

实际上,您在一个单元格中粘在一起了 3 个不同的 IF 语句。一个 IF 后跟两组嵌套 3 层的 IF。以下是我简化后的格式:

=IF(condA,"C"," "),
=IF(condB,IF(condC,"O",IF(condD,IF(condE,"C",IF(condF,"R"," "),
=IF(condG,IF(condH,"O",IF(condI,IF(condJ,"C",IF(condK,"R"," "))))

3. 那么我们如何建立复杂条件?

我们的简化格式更容易揭示的另一件事是,所有这些 IF 都只有 4 种可能的结果:C、O、R 和 SPACE。作为一般规则(也有例外),让我们尝试以这样一种方式编写条件,即每个结果只有一个条件或一个 IF。因此,从最终结果开始,用通俗易懂的语言编写您的第一遍,如下所示:

This cell should contain C when: *list conditions*
This cell should contain O when: *list conditions*
This cell should contain R when: *list conditions*
This cell should contain " " when: *list conditions*
0therwise, it should contain *whatever*

因此,您可以使用所有嵌套的 AND 和 OR 将列出的条件表达为四个条件公式(如果需要,如果没有匹配,则加上一个默认值):

condC = blah blah blah
condO = blah blah blah
condR = blah blah blah
condSpace = blah blah blah
otherwise = blah

现在这些条件很容易输入到 LET 简化的嵌套 IF 中,并且我们假设如果没有匹配项,您想要一个空值:

LET(
condC, blah blah blah,
condO, blah blah blah,
condR, blah blah blah,
condSpace, blah blah blah,
IF(condC, "C", IF(condO, "O", IF(condR, "R", IF(condSpace, " ", ""))))
)

4.最后,如果您的版本支持,请使用 IFS 而不是 IF 创建一个更简单的 IF-THEN-ELSEIF 逻辑结构:

IFS(condC, "C", condO, "O", condR, "R", condSpace, " ", TRUE, "")

IFS 参数的形式为:条件、结果、条件、结果等。IF 函数在第一次遇到 TRUE 条件时退出并返回结果,从左到右,然后仅在条件/结果不满足时继续执行下一个条件/结果。如果“condC”不满足,它才会继续检查“condO”。我们只需将最后一个条件设为 TRUE 并给出结果,即可创建默认的“如果所有其他条件都失败”答案。如果不需要“未找到”结果,则公式可以简化为:

IFS(condC, "C", condO, "O", condR, "R", condSpace, " ")

请记住,我假设这个 IFS 函数位于首先定义四个条件的 LET 函数内部。

希望这能有所帮助。我想创建一个更完整的答案,可能对您有用,并且对可能通过“另请参阅:”链接到此答案的未来搜索者也有用。

相关内容