Excel中使用NOT()反转布尔结果公式失效,请求原因分析
首先咱们来拆解你的问题:原公式能正常运行,但嵌套NOT()后Excel无法识别,核心原因大概率和数组公式的输入要求有关,另外也可以通过逻辑简化来规避这个问题。
为什么嵌套NOT()后会出错?
你的原公式里用到了ROW(INDIRECT("1:12")),这会生成一个包含1到12的数组。在旧版Excel(非动态数组版本,比如2019及更早)中,这类依赖数组运算的公式需要通过Ctrl+Shift+Enter(简称CSE组合键)来确认输入,Excel才会正确解析数组逻辑。
当你在外层嵌套NOT()后,如果还是按普通的Enter键确认,Excel无法识别其中的数组运算,就会报错。而原公式可能你之前是按CSE输入的,所以能正常运行,但嵌套后忘记了这一步。
两种解决方案
方案1:按数组公式要求输入
把嵌套NOT()后的完整公式输入单元格后,不要按Enter,而是按下Ctrl+Shift+Enter。此时Excel会自动给公式加上一对大括号{}(注意不要手动输入大括号),公式就能正常运行了。
嵌套后的完整公式(供你复制):
=NOT(OR(ISBLANK(B2),AND(LEN(B2)=12,ISNUMBER(SUMPRODUCT(FIND(MID(B2,ROW(INDIRECT("1:12")),1),"0123456789abcdefABCDEF"))))))
方案2:用逻辑定律简化公式(更推荐)
根据De Morgan定律,NOT(OR(A,B))等价于AND(NOT(A), NOT(B)),咱们可以把反转后的逻辑直接写出来,不仅更易读,还能降低Excel解析复杂嵌套数组的概率。
原公式的逻辑是:返回True当且仅当「B2为空」或者「B2是12位十六进制字符串」。反转后就是返回True当且仅当「B2不为空」并且「B2不是12位十六进制字符串」。
转化后的公式如下:
=AND(NOT(ISBLANK(B2)), OR(LEN(B2)<>12, NOT(ISNUMBER(SUMPRODUCT(FIND(MID(B2,ROW(INDIRECT("1:12")),1),"0123456789abcdefABCDEF")))))
同样,在旧版Excel中输入这个公式时,记得按Ctrl+Shift+Enter确认;如果是Excel 365/2021这类支持动态数组的版本,直接按Enter即可。
额外优化建议
你原公式中判断十六进制字符的部分,可以用COUNTIF来简化,避免SUMPRODUCT的数组运算(在旧版Excel中更稳定):
=AND(NOT(ISBLANK(B2)), OR(LEN(B2)<>12, COUNTIF(MID(B2,ROW(INDIRECT("1:12")),1),"[0-9a-fA-F]")<>12))
这个公式通过统计符合十六进制规则的字符数量,如果不等于12,就说明存在非法字符,逻辑和原公式一致,但更简洁。
内容的提问来源于stack exchange,提问作者Helloguys

