AND、OR、NOT 与布尔运算

一、TRUE 与 FALSE 的本质是 1 和 0

逻辑值运算的四条规则

Excel 里的逻辑值只有两个:TRUE 与 FALSE。它们看起来是文字,实际上可以直接参与算术运算,TRUE 等于 1,FALSE 等于 0。在单元格里写 =TRUE+1 会得到 2,写 =FALSE*5 会得到 0,这看似是个冷知识,却是整个布尔运算体系的基础。

理解这一点之后,很多公式的写法就豁然开朗了。=SUM((C2:C200>5000)*D2:D200) 之所以能算出满足条件的金额合计,就是因为 C2:C200>5000 先生成了一串 TRUE 与 FALSE,乘号把它们转成 1 和 0,再与金额相乘,不符合条件的行因此变成 0。

反向转换同样成立。要把 1 和 0 转回 TRUE 与 FALSE,用 =--(条件) 或者在前面加两个负号。写成 =--(C2>5000) 会得到 1 或 0,写成 =C2>5000 会得到 TRUE 或 FALSE。多条件计数时经常需要这种转换,因为 SUMPRODUCT 只认数字不认真假值。

还有一个细节:在单元格里直接输入 TRUE 或 FALSE 这两个词,Excel 会自动识别为逻辑值并居中显示;输入 =TRUE 效果相同。但如果在公式里给它们加了英文双引号,就变成了文本,不再能参与算术运算。这是区分逻辑值与文本的关键。

逻辑值还影响 AGGREGATE、SUBTOTAL 这类函数的行为,也决定条件格式是否生效。条件格式规则的本质就是一个返回 TRUE 或 FALSE 的公式,条件为真就应用格式。理解这一点,就能写出任意复杂的条件格式规则,而不必局限于内置的几种。

逻辑值还有一处细节值得留意:它在排序与筛选中的表现。升序排序时 FALSE 排在 TRUE 之前,因为 0 小于 1。筛选逻辑值列时,下拉框里只会出现 TRUE 与 FALSE 两个选项,不像文本列那样可能出现拼写变体。这也是为什么用布尔辅助列做筛选开关,比用文本标记更可靠。

二、AND 与 OR:把多个条件合成一个

AND与OR最易记混的一对

=AND(条件1,[条件2],...) 在所有条件都为真时返回 TRUE,只要有一个为假就返回 FALSE。=OR(条件1,[条件2],...) 在任意一个条件为真时就返回 TRUE,全部为假才返回 FALSE。两者最多支持 255 个参数。

最常见的用法是配合 IF 做综合判断。判断是否为重点客户,写成 =IF(AND(C2>500000,D2>0.9),"重点","普通");判断是否命中任一风险项,写成 =IF(OR(C2>1000000,D2<0.5,E2="逾期"),"需复核","正常")。比嵌套 IF 清晰得多,也更好维护。

函数 全部为真 至少一个为真 全部为假 参数个数
AND TRUE 视情况 FALSE 最多 255 个
OR TRUE TRUE FALSE 最多 255 个
NOT FALSE 视情况 TRUE 只能 1 个
乘号 1 视情况 0 任意
加号 大于 0 大于 0 0 任意

AND 与 OR 有两个重要限制。第一,它们只返回一个结果,不能对区域逐行判断后返回一串结果。写 =AND(C2:C200>5000) 不会得到 199 个真假值,只会得到一个。要逐行判断必须用乘号或加号,或者配合 SUMPRODUCT。这是新手最常踩的坑,没有之一。

第二,它们在数组公式里的行为是聚合。写 =SUM(IF(AND(A2:A10>0,B2:B10<5),1,0)) 得不到预期结果,因为 AND 把整个区域压缩成了一个值。正确写法是把乘号当与、加号当或:=SUMPRODUCT((A2:A10>0)*(B2:B10<5))。记住这条规则,能省掉大量调试时间。

AND 与 OR 还有一个容易被忽略的行为:它们会忽略参数区域里的文本与空白。写 =AND(A2:A10>0) 时,如果区域里混着文本,那些单元格不参与判断,也不会报错。这既有好处也有风险,好处是脏数据不会让公式崩溃,风险是你以为检查了十行,实际只检查了八行。需要严格校验时,先用 COUNT 确认数值个数。

另外一个实用技巧:AND 与 OR 可以直接返回数值用于计算。写成 =(AND(C2>5000,D2>0.9))*100 会在两个条件都满足时得到 100,否则得到 0。这种写法比 =IF(AND(...),100,0) 略短,但可读性稍差,团队内部约定一种即可,不要混用。

三、NOT:取反与它在判断中的用法

=NOT(条件) 把 TRUE 变成 FALSE、把 FALSE 变成 TRUE,只能接受一个参数。它最常见的用法是配合 IS 系列函数,例如 =IF(NOT(ISBLANK(A2)),"已填","未填"),判断单元格是否非空。

多数 NOT 场景都有更直接的替代写法。=NOT(A2>60) 等价于 =A2<=60,=NOT(ISBLANK(A2)) 等价于 =A2<>""。在能直接写反向条件时,直接写更短也更易读。NOT 真正的价值在于条件本身很复杂时,例如 =IF(NOT(AND(C2>100,D2<0.5)),"正常","异常"),取反一个复合判断。

NOT 在条件格式里也很实用。比如要高亮所有非本月的行,规则写成 =NOT(AND(A2>=月初,A2<=月末)),比写两个 OR 条件更简洁。条件格式里凡是能用一次 NOT 解决的反面判断,都比罗列一堆例外要清晰。

还有一类典型用法是与信息函数配合做数据清洗。=IF(NOT(ISNUMBER(A2)),"非数值",A2) 把非数值挑出来标记,配合筛选就能批量定位问题数据。判断数据类型的思路在 计数三兄弟:COUNT、COUNTA、COUNTIF、COUNTIFS 里也有涉及,两者可以互相印证。

NOT 也可以嵌套自身,写成 =NOT(NOT(条件)) 等价于原条件,实际中没人这么写。真正有用的是把它与 AND、OR 组合做德摩根变换:=NOT(AND(A,B)) 等价于 =OR(NOT(A),NOT(B)),=NOT(OR(A,B)) 等价于 =AND(NOT(A),NOT(B))。当条件很长时,用这个变换往往能写出更短的公式。

四、布尔运算进阶:乘号加号与数组

在数组运算里,乘号代表与、加号代表或,这是必须记住的对应关系。写 =SUMPRODUCT((B2:B200="市场部")*(C2:C200>5000)) 统计市场部且金额大于 5000 的行数;写 =SUMPRODUCT((B2:B200="市场部")+(B2:B200="销售部")) 统计两个部门的总行数。

为什么乘号是与?因为只有两个条件都为真时,1 乘 1 才等于 1,只要有一个是 0,乘积就是 0。为什么加号是或?因为只要有一个为真,相加就大于 0。这套映射关系简单而严谨,理解之后不需要死记。

三个及以上条件混用时,用括号明确优先级。例如 (部门为市场部 或 销售部) 且 金额大于 5000,写成 =SUMPRODUCT(((B2:B200="市场部")+(B2:B200="销售部"))*(C2:C200>5000))。注意或的部分要用括号包起来,否则乘号会先与后面的条件结合,逻辑就错了。

与:条件A * 条件B
或:条件A + 条件B
非:1 - 条件A
三者混合:(条件A + 条件B) * (1 - 条件C)

取反在数组里写成 1-条件,因为 TRUE 是 1、FALSE 是 0,用 1 减去它就完成了取反。例如统计非市场部的行数,写 =SUMPRODUCT(1-(B2:B200="市场部"))。注意这里不能用 NOT,理由前面说过,NOT 会把整个区域压成一个值。

SUMPRODUCT 是承载这些布尔运算的最佳容器,因为它天生支持数组运算,不需要三键确认。写成 =SUMPRODUCT((条件一)*(条件二)*数值区域) 就能直接得到条件求和,不需要 SUMIFS,也不受条件区域形状限制。多条件统计的更多写法可以对照 SUM 家族:SUM、SUMIF、SUMIFS。

布尔运算最常见的搭档是条件格式。要给同时满足两个条件的行标色,规则写成 =AND($C2>5000,$D2<0.5);要给满足任一条件的行标色,规则写成 =OR($C2>5000,$D2<0.5)。注意条件格式里必须用相对引用与绝对引用的组合,列前加美元符号而行号不加,这样规则才能正确应用到整个区域。

还有一类高频用法是把布尔结果当作筛选开关。在数据旁边加一列写 =--(AND(B2="市场部",C2>5000)),得到 1 和 0 的辅助列,之后无论是筛选、排序还是透视,都可以直接拿这一列当条件。这种做法把复杂判断一次性固化下来,后续所有分析都复用它,比每次重写公式高效得多。

五、真实场景

先说一条总原则:写多条件公式前,先把条件用中文写清楚,再决定用哪种工具。条件之间全是并且关系、且不需要加工数据,用 COUNTIFS 或 SUMIFS;条件里有或关系、或者需要对数据做转换,用 SUMPRODUCT;只是给单条记录做标记,用 IF 加 AND 或 OR。选对工具,公式长度往往能差一半。

场景一:多条件计数与求和。统计市场部在 2026 年一月的订单数与金额,分别写成 =SUMPRODUCT((B2:B200="市场部")*(A2:A200>=DATE(2026,1,1))*(A2:A200<DATE(2026,2,1))) 与 =SUMPRODUCT((B2:B200="市场部")*(A2:A200>=DATE(2026,1,1))*(A2:A200<DATE(2026,2,1))*C2:C200)。前者数行数,后者加金额,只差最后乘不乘金额区域。

场景二:排除法统计。要统计除已取消、已退款之外的订单金额,写成 =SUMPRODUCT((E2:E200<>"已取消")*(E2:E200<>"已退款")*C2:C200)。用两个不等于条件相乘实现排除,比写 SUMIFS 的两个条件更直观,也不受函数版本限制。

场景三:复合预警。库存低于安全库存且近 30 天无出库,需要立刻处理。写成 =IF(AND(D2<E2,F2<30),"紧急补货",IF(D2<E2,"关注","正常"))。先用 AND 判断最紧急的情况,再用单层 IF 兜住次一级的情况,层次分明。

场景四:任意条件命中即标记。客户命中任一风险特征就标记,写成 =IF(OR(C2>1000000,D2<0.5,E2="逾期",F2=""),"需复核","正常")。OR 的参数可以任意增加,新增一个风险特征只需加一个条件,不用改结构。

场景四的补充:风险特征很多时,与其把十几个条件全部塞进 OR,不如建一张风险清单表,然后用 =IF(COUNTIF(风险清单!A:A,E2)>0,"需复核","正常") 判断当前状态是否命中清单。清单可以随时增删,公式一个字都不用改。这是用查表替代长条件判断的又一例,可维护性高下立判。

场景五:交叉验证。判断两列数据是否完全一致,写成 =IF(AND(A2=B2,ABS(A2-B2)<0.01),"一致","不一致")。第一个条件比较值,第二个条件排除浮点误差,两个条件同时满足才算一致。浮点比较留容差是通用做法,避免二进制精度带来的误判。

六、布尔运算速查与写法选择

面对一个多条件需求,先判断它属于哪一类。下面这张表按需求类型给出推荐写法,照着选基本不会出错。

需求 推荐写法 说明
多个条件同时满足才计数 =COUNTIFS(B:B,"市场部",C:C,">5000") 最快最易读
多个条件同时满足才求和 =SUMIFS(C:C,B:B,"市场部",D:D,">0") 参数顺序别记错
条件特别复杂或有计算 =SUMPRODUCT((条件一)*(条件二)*金额) 兼容性最好
单条记录的复合判断 =IF(AND(...),值一,值二) 返回单个结果
区域逐行的复合判断 =--((条件一)*(条件二)) 配合辅助列使用
判断是否存在命中记录 =COUNTIFS(...)>0 比 SUMPRODUCT 快

选择写法时有两条经验。第一,能用 COUNTIFS 与 SUMIFS 就不要用 SUMPRODUCT,前者更快也更易读,只有当前者表达不了时才动用后者。典型场景是条件里需要对数据做加工,比如 =SUMPRODUCT((TEXT(A2:A200,"yyyy-mm")="2026-01")*C2:C200),这种加工型条件 SUMIFS 写不出来。

第二,能用辅助列就不要写超长公式。把复合判断的结果落到辅助列,写成 =--((B2="市场部")*(C2>5000)),再对辅助列求和,逻辑清晰、调试方便,接手的人一眼就懂。辅助列增加的是列数,减少的是沟通成本,这笔交易通常很划算。

布尔运算还有一个性能提醒:SUMPRODUCT 会对整块区域逐行计算,区域写得越大越慢。不要无脑写成整列引用,把范围限定在实际数据区,例如 B2:B2000 而不是 B:B。如果确实需要动态范围,转成智能表后用结构化引用,既自动扩展又不会无限膨胀。

常见问题

条件里怎么表达既不是 A 也不是 B

两种写法都行。用 AND 写成 =AND(B2<>"市场部",B2<>"销售部"),用加号取反写成 =SUMPRODUCT(1-((B2="市场部")+(B2="销售部")))。前者用于单条记录判断,后者用于批量统计。逻辑上要注意,既不是 A 也不是 B 等价于非(A 或 B),这是德摩根定律,理解它能在条件变复杂时少绕很多弯。

为什么用乘号统计出来的数字比预期大

多半是因为或关系里出现了重叠。比如统计市场部和销售部,某行同时满足两个条件时,加号会得到 2 而不是 1,导致重复计数。解决办法是在外层套一个判断:=SUMPRODUCT(--(((B2:B200="市场部")+(B2:B200="销售部"))>0)),先相加再判断是否大于 0,把 2 压回 1。数据里存在重叠分类时,这一步不能省。

AND 用在数组公式里为什么结果不对

因为 AND 是聚合函数,它会把整个区域压缩成一个 TRUE 或 FALSE,而不是返回一串结果。写 =AND(A2:A10>0) 得到的是所有行是否都大于 0 这一个判断,不是十行各自的判断。要逐行判断就用乘号:=SUMPRODUCT((A2:A10>0)*1)。这条规则同样适用于 OR 与 NOT,凡是需要对区域逐行判断的场景,一律用乘号加号,不要用 AND 与 OR。

真假值参与 SUM 时会被计入吗

区域里的逻辑值会被 SUM 忽略,直接写在参数里的则会被当成 1 或 0。也就是说 =SUM(TRUE,1) 返回 2,而区域里放 TRUE 时 =SUM(A1:A10) 不会把它算进去。想让区域里的真假值参与计算,先乘 1 或用双负号转换,写成 =SUMPRODUCT(--(A1:A10))。这个差异常常导致统计结果莫名偏小。

SUMPRODUCT 里条件区域大小不一致会怎样

会返回 #VALUE!。SUMPRODUCT 要求所有参数的形状完全一致,都是同样的行数与列数。写完后用鼠标点选检查一下每个参数的高亮区域,范围一致才算安全。这也是为什么建议用填充柄拖出后续区域,而不是手打,手打最容易多一行或少一行。

布尔运算的结果怎么变成可读的文字

用 IF 包一层。写成 =IF(SUMPRODUCT((B2:B200="市场部")*(C2:C200>5000))>0,"存在","不存在"),或者更简单地用 =IF(COUNTIFS(B2:B200,"市场部",C2:C200,">5000")>0,"存在","不存在")。判断是否存在满足条件的记录,COUNTIFS 通常比 SUMPRODUCT 更快也更易读,只有条件特别复杂时才需要 SUMPRODUCT。

布尔运算能替代 IF 吗

在很多场景里可以,而且公式更短。要按条件给分,写 =(C2>=90)*3+(C2>=60)*1 就能得到 0 到 4 的分值,不需要任何 IF。但可读性会下降,别人看到这行公式需要反应一下。折中做法是简单判断用布尔运算,需要返回文本的用 IF,团队内部统一约定即可。

条件里同时有与和或,括号该怎么加

先想清楚业务逻辑的主干是哪一个。如果主干是与,就把每个或的部分用括号包起来,再相乘;如果主干是或,就把每个与的部分包起来,再相加。写成公式后,用几个典型的测试数据验证:只满足条件一的、只满足条件二的、两个都满足的、两个都不满足的,四种情况都符合预期才算写对。

WPS 里布尔运算有差异吗

AND、OR、NOT 在 WPS 表格里完全支持,行为一致。SUMPRODUCT 同样支持数组运算,绝大多数场景不需要三键确认。需要注意的还是老版本对动态数组的支持差异,遇到结果异常时,先确认 WPS 版本,再把数组公式改成辅助列逐步计算,通常就能绕过兼容性问题。

真假值能直接用在加减乘除里吗

能。TRUE 当作 1、FALSE 当作 0,所以 =(C2>5000)*100 在条件成立时返回 100,不成立时返回 0。这个特性让很多条件计算可以不写 IF,公式更短。但要注意可读性:如果只是想返回两个值,写 IF 更清楚;只有当真假值需要参与批量数组运算时,才值得用这种写法。