在一个 Excel 公式中嵌套 IF、AND 和 OR 语句

Nested IF, AND, and OR statements in one Excel formula

我正在制作一个人们可以输入数据的单元格,并尝试以多种方式解释它。他们可以输入 7 到 20 个字符的代码。根据长度和前导字符,我希望它去除多余的数据并只留下一个序列号。 人们可以输入的数据的不同可能性如下:

7 character serial #
8 character serial #
8 character serial # with leading L
9 character serial # with leading D or L
10 character serial #
11 character serial # with leading M
12 character serial #
13 character serial # with leading M
20 character serial # with 12 leading useless characters

我已经设法创建了多个 IF 语句,这些语句可以单独识别其中的每一个,但我试图将它们组合成一个公式,以便在编辑输入的数据后,一个单元格只显示一个有效的序列号来自一个单独的单元格。 我设法混合了其中的几个,但是我添加的 AND and/or OR 语句越多,就越容易混淆,也更有可能破坏公式。

有没有 easier/better 方法来做到这一点?

作为附录,感谢特殊实例:

我已经删除了上面尝试的公式,并重新创建了 4 个公式,贴在下面,它们执行上述每个必要步骤,但它们是分开的,我需要它们在一起:

=IF(AND(LEN(A2)=8,(LEFT(A2,1)="L")), RIGHT(A2,7),A2)
=IF(AND(OR(LEFT(A2,1)="D",LEFT(A2,1)="L"),LEN(A2)=9),RIGHT(A2,8),A2)
=IF(OR(LEN(A2)=11,LEN(A2)=13),RIGHT(A2,LEN(A2)-1),A2)
=IF(NOT(LEN(A2)=20),A2,RIGHT(A2,8))

您需要嵌套 IF 语句,使它们像决策树上的一串珍珠一样。你可能想先把它画在纸上

if( Len(A1)=7,
   if(left(A1,1)="L",
      remove first character
      else use A1
     ) ,closing last IF
   if(Len(A1)=8,
      if(or(left(A1,1)="L",left(A1,1)="D",
         remove first character,
         else use A1
         ), closing last IF  
      if 10 characters
         if first character M
            remove first character
            else use A1
         close last if
         if 12 characters

等等......你最终会得到许多嵌套的 IF 语句和最后的一堆右括号。

键入公式时使用 Alt+Enter 换行可能会有所帮助,这样您可以缩进空格并更好地查看结构。

编辑:如果你有 Office 365,你也可以使用 IFs 函数,它对许多条件有更简单的语法并且不需要嵌套。对于满足的第一个条件,将执行以下操作,因此您需要注意相应地对条件进行排序。首先检查 7 个字符和一个前导 L,然后仅检查 7 个字符。如果你把这两个反过来,你永远不会得到第二个结果。

=IFS(
AND(LEN(A1)=7,LEFT(A1,1)="L"),"remove first",
LEN(A1=7),A1,
AND(LEN(A1)=8,OR(LEFT(A1,1)="L",LEFT(A1,1)="D")),"remove first",
LEN(A1)=8,A1,
etc…..)

制作如此复杂的公式将导致无法维护的混乱。让它工作将很困难,如果您以后发现错误,将很难打开您的巨大公式来解决它。

让您摆脱困境的编程模式是辅助列

在您的数据右侧创建 13 列,并在每列中放入一个公式,就像您所做的那样,但将所有其他内容设为 "" - 您最终只会得到一列每行都有文字。

现在,对于第 14 列,连接所有 13 列。现在您的所有序列号都在同一列中。

最后,select13个助手列,右击,隐藏——它们只是助手,不需要经常显示。

下面的公式将您的逻辑整合为 3 种可能性

=IF(SUM(N(LEN(A1)={7,10,12})),A1,
 IF(SUM(COUNTIF(A1,"L???????"),COUNTIF(A1,{"L","D"}&"????????"),COUNTIF(A1,"M??????????"&{"","??"})),REPLACE(A1,1,1,""),
 IF(SUM(N(LEN(A1)={8,20})),RIGHT(A1,8),"ERROR")))
  1. 输入有效的地方
  2. 其中输入需要消除第一个字符
  3. 其中只有最后 8 个字符 输入有效

对于提供的样本,它产生了正确的结果: (由于使用了数组常量,因此必须以 array formula 形式输入)

但是这个答案纯粹是你的样本的函数,因为序列号通常是字母数字类型,我认为这是不现实的,例如逻辑涉及删除前导 LDM 字符,但您的数据表明这 3 个相同的字符 can 出现在重新格式化的数据中 -如果现实是这样的字符永远无效,那么可以通过使用一系列 SUBSTITUTE() 函数来简化逻辑。