1. 为什么默认的“文本包含”不够用:其实它只覆盖了最简单的情况
1.1 默认规则到底做了什么
有朋友给我发来一份两千多行的供应商名单,让我帮他标出客户名称里带“科技”两个字的单元格。这大概是条件格式最典型的用法:选中数据区,开始——条件格式——突出显示单元格规则——文本包含,输入“科技”,选个填充色,确定,完事。
这一步确实能在大部分时候解决问题。但注意,所谓“文本包含”,本质上做的是通配符包含匹配,它等价于你在背后写了一句 COUNTIF(A1,"*科技*")>0。这句话翻译过来是:只要单元格里出现过“科技”这两个字符,无论出现在开头、中间还是结尾,都算命中。这也是它最大的特点:简单,但不可控。
我在实际帮人处理表格的时候,发现默认规则能覆盖的需求可能只有一半。剩下的一半,要么是“包含”的反面,要么是多个条件叠加,要么是关键词想要随时换着来。这些问题一旦出现,默认的“文本包含”就完全帮不上忙,必须回到条件格式的最底层能力——用公式判断。
1.2 我需要排除,而不是包含
第一个典型需求是“不包含”。比如那张供应商名单里,我要标出所有名称里不包含“科技”的客户,方便业务部门做筛选。你打开“文本包含”对话框,会发现这个功能压根没有“不包含”的选项,它只能帮你把包含的标出来。有人会想,那我先标包含的,再反选行不行?不行,条件格式是实时刷新的,没有“反选”这种操作。
这种情况只能用公式。条件格式的“使用公式确定要设置格式的单元格”支持任意布尔表达式,所以我可以写:
excel复制=NOT(ISNUMBER(FIND("科技", $A2)))
这句的意思是:在A2里找“科技”,找到会返回一个位置数字,找不到会返回错误;ISNUMBER 把“找到”变成 TRUE、把“找不到”变成 FALSE,再套一个 NOT 取反,就变成:当A2不包含“科技”时,条件成立。
这类“反着匹配”的需求,在数据清洗里很常见。比如要标出备注里没有写联系电话的记录,或者标出产品名称里漏写了规格型号的行,不包含判断比包含判断更有价值,因为你要处理的是异常数据。
1.3 关键词得能随时替换
第二个需求更头疼。朋友说,这个“科技”只是第一轮筛选,后面他可能要看“贸易”“股份”“集团”,每一轮都要重新标一遍。你要是用默认的“文本包含”,每换一个关键词,就得打开一次对话框,把旧词删掉、敲入新词、再确认。一次两次还好,连续看五六个关键词,人会疯掉。
更合理的做法,是预留一个专门放关键词的单元格。比如我在E1单元格里输入“科技”,条件格式的公式里引用 $E$1,之后我只改E1的内容,整张表的高亮就会自动跟着变。原理其实很简单:条件格式公式支持引用单元格,而且引用单元格的值会实时参与计算。这就是一个最简单的动态高亮看板。
1.4 英文语境里的痛:默认规则不区分大小写
还有一个默认规则完全没法处理的情况:大小写。假设你的表格里有一列英文状态标识,要标出所有包含“CRM”的单元格。默认的“文本包含”是不区分大小写的,它会把“crm”“Crm”“CRM”全部标出来。如果业务上只关心全大写“CRM”,默认规则就做不到。
这类场景下,FIND 函数是目前最简单可靠的方案。FIND 是区分大小写的,它找“CRM”就不会匹配“crm”。所以,表面上看“文本包含”对话框帮我们做了所有事,其实它把匹配逻辑写死了、写简单了。
我现在做条件格式,凡是涉及子字符串匹配的,几乎不用默认的“文本包含”,全部走公式规则。理由很简单:公式规则可以涵盖默认规则的全部功能,反过来默认规则却覆盖不了公式规则的能力。
2. ISNUMBER+FIND/SEARCH:子字符串匹配的两条公式路线与选择标准
2.1 为什么不管用哪个函数,都要先包一层ISNUMBER
在条件格式里写公式,最基础也最容易被忽略的一点:条件格式要求公式最终返回 TRUE 或 FALSE,你写出的公式只要最后是一个逻辑判断就行。但这里的判断入口很容易踩坑。
FIND 函数的作用,是在一个文本串里找另一个文本串的位置。比如 FIND("科技", A2),如果A2里真有“科技”两个字,它返回“科技”第一次出现的位置数字,可能是1、2、5等等。可如果A2里没有“科技”,它不会返回0,而是直接返回一个 #VALUE! 错误。
把错误值丢给条件格式,条件格式会认为这个公式有问题。所以常见的正确姿势,是外面套一层 ISNUMBER:
excel复制=ISNUMBER(FIND("科技", A2))
ISNUMBER 的逻辑是:如果是数字,返回 TRUE;如果不是数字,比如是文本或者错误值,返回 FALSE。这样 FIND 返回位置时得到 TRUE,返回错误时得到 FALSE,正好变成条件格式需要的布尔值。
这个套路我记得很清楚,因为早期我总是不包 ISNUMBER,写出来的规则时灵时不灵,尤其是高亮区域一大,有些行标上了颜色,有些行没标,根本看不出规律。后来才明白,没标颜色的行,都是在 FIND 里掉了链子。
2.2 FIND:区分大小写的精确路线
FIND 有三个参数:要找什么、在哪个文本里找、从第几个字符开始找。第三个参数多数时候可以省略,默认从第1个字符开始。
excel复制=ISNUMBER(FIND("CRM", A2))
这条规则的含义,是只有A2中出现完整的大写“CRM”才触发高亮。如果A2里是“crm系统”,FIND 直接返回错误,规则不生效。这在处理公司名、代码、编号、英文缩写的时候非常实用,因为这类数据往往对大小写有严格要求。
另一个隐藏细节是,FIND 不支持通配符。你在 FIND 里写 "*科技*",它找的不是“任意字符串科技的任意字符串”,而是字面的星号、文字科技、星号。这一点跟很多人的直觉相反,也是第3章要展开聊的话题。
2.3 SEARCH:忽略大小写,还能用通配符
跟 FIND 长得像的还有一个 SEARCH 函数。它的用法几乎一样:
excel复制=ISNUMBER(SEARCH("crm", A2))
区别在于两点。第一,SEARCH 不区分大小写,上面这个公式能把“CRM”“Crm”“crm”全命中;第二,SEARCH 支持通配符,* 和 ? 在搜索模式里是有特殊含义的。
所以如果你要做模糊匹配、又要忽略大小写,SEARCH 是比 FIND 更省事的选择。但如果你要严格区分大小写,或需要避免通配符造成意外命中,就用 FIND。
2.4 两条路线的选择标准:一张表说清
| 需求 | 推荐函数 | 示例公式 |
|---|---|---|
| 普通中文关键词,无大小写问题 | FIND / SEARCH 任一 | =ISNUMBER(FIND("科技",A2)) |
| 英文关键词,要求区分大小写 | FIND | =ISNUMBER(FIND("CRM",A2)) |
| 英文关键词,忽略大小写 | SEARCH | =ISNUMBER(SEARCH("crm",A2)) |
| 需要通配符模糊匹配或排除 | SEARCH / COUNTIF | =ISNUMBER(SEARCH("P-*",A2)) |
这个表看起来简单,但真正决定用哪个函数的时候,还是要回到业务字段本身的语义。比如客户名称里的大小写往往没有业务含义,用 SEARCH 更稳;而产品代码、状态码这类严格约定的大小写,就应该用 FIND。
2.5 新建条件格式规则的标准操作步骤
先写一版标准操作,后面所有公式都会基于这个流程:
- 先选中要应用条件格式的数据区域,注意确保你要高亮的范围是整片区域。我习惯把活动单元格定位在数据区左上角那一格。
- 点击“开始——条件格式——新建规则”。
- 在对话框里选择“使用公式确定要设置格式的单元格”。
- 在“为符合此公式的值设置格式”输入框里写公式。
- 点击“格式”,设置填充色、字体颜色、边框等。
- 确定后回到工作区,规则立即生效。
这里最关键的一点是活动单元格的位置。因为条件格式公式里的相对引用会根据活动单元格平移,如果你选中的区域左上角不是公式里的A2,结果就会错位。通常我把活动单元格放在数据区第一行第一列,也就是公式里那个“参照点”。
我用这个流程跑过了很多张表,只要是子字符串高亮,几乎都是这么操作。区别只在于公式里写了什么、格式用什么颜色。
3. 通配符的真实边界:*、?、~ 能匹配什么,不能匹配什么
3.1 三个通配符的基本语义
Excel 文档里的通配符算得上短小精悍。* 表示任意长度的任意字符序列,包括0个字符;? 表示单当前这个位置必须有且仅有一个任意字符;~ 是转义符,用来把后面的 *、?、~ 还原成普通字符。
举个例子:
P-*匹配以“P-”开头的文本,后面有没有内容都可以。P-??匹配“P-”加两个任意字符,总共4个字符。P-~*匹配“P-*”这个字面文本,这里的星号被当成普通星号处理。
在条件格式里,通配符最大的价值,是可以快速表达“以什么开头”“以什么结尾”“中间缺几个字符”这类 FIND 做不到的匹配。比如你要高亮所有以“科技”开头的公司名,用默认的“文本包含”是做不到的,因为“文本包含”只管中间有没有,不管开头。
3.2 支持通配符和不支持通配符的常见函数
这里有一个非常容易踩的认知坑:不是所有Excel函数都支持通配符。支持通配符的常见函数有 COUNTIF、SUMIF、AVERAGEIF、MATCH、SEARCH、VLOOKUP(模糊匹配模式)等;不支持通配符的常见函数有 FIND、LEFT、RIGHT、MID、SUBSTITUTE 等。
我把“支持通配符”理解为“函数内部有一个匹配引擎”,而 FIND 本质上只是一个“逐字符定位器”,它没有匹配引擎,所以你把 * 放进去也只能当星号处理。
因此,当你想在条件格式里用通配符时,第一反应不应该是往 FIND 里塞星号,而是换用 SEARCH 或 COUNTIF。这就是前面第2章那两张表的延伸。
3.3 用 COUNTIF 实现“包含”判断
COUNTIF 是条件格式场景里很实用的函数,因为它直接返回数字,天然适合做包含判断。最典型的写法是:
excel复制=COUNTIF(A2, "*科技*") > 0
COUNTIF 的第一参数是待判断的单元格,第二参数是匹配条件,写法非常接近人类语言:统计A2这个单元格里满足“前面任意字符 + 科技 + 后面任意字符”的次数,大于0就表示包含。这个公式的返回值,要么是0要么是1,条件格式直接把它当布尔值用。
如果关键词放在单元格里,比如E1,那就是:
excel复制=COUNTIF(A2, "*"&$E$1&"*") > 0
注意这里第二参数是拼接出来的,用 & 把星号、关键词、星号连成一个字符串。这个写法在动态关键词场景里非常常用。
3.4 SEARCH 和 COUNTIF 到底选哪个
先说结论:绝大多数“包含”场景,两者都可以用;但它们的性格不一样。COUNTIF 的匹配更“整体”,它把A2整个文本当成一次匹配对象;SEARCH 的匹配更“灵活”,它是在文本里找一个可能出现的片段,返回位置。不过在实际条件格式公式里,两者殊途同归。
我的选择标准是:如果关键词是固定的、写死在规则里的,用 COUNTIF 最省心;如果关键词在单元格里、随时会改,用 COUNTIF 的拼接写法也很方便;如果还要顺带忽略大小写,COUNTIF 本身大小写不敏感,直接可用。
3.5 一个很少人知道但很实用的转义用法
真正需要转义的场景,是产品编号或代码里出现了星号。比如 A列里有“A123”“B456”,你要高亮所有包含星号的单元格,直接写 "*" 会被当成通配符,导致规则匹配所有内容。
这时候就要动用 ~ 转义:
excel复制=COUNTIF(A2, "*~**") > 0
这个公式看起来有点吓人,拆开看其实很清晰:第一个 * 匹配任意开头,~* 匹配一个真实的星号,最后一个 * 匹配任意结尾。整体意思就是“文本里包含一个星号”。
同样的道理,要匹配文本里的问号,写法是 "*~?*"。这个技巧我是在一次处理编码表的时候查了好久才弄明白。条件格式里这类冷门用例不多,但碰到了就是救命。
4. 引用规则与动态关键词:从固定高亮到整行联动
4.1 条件格式公式里的绝对引用和相对引用
条件格式里的公式,和普通单元格里的公式遵循同一套引用规则,但很多人在这里吃大亏,因为它比普通公式更难肉眼察觉。
当你选中一片区域,新建条件格式规则时,公式里的相对引用会以区域内每一个单元格为基准自动平移。举个具体例子:你选中A2:A100,活动单元格是A2,公式写:
excel复制=ISNUMBER(FIND("科技", A2))
Excel 会对A2判断一次、对A3判断一次、对A4判断一次……等于说这个公式会被复制到区域内每个单元格上,只是复制时引用自动变化。这正是条件格式的一大优势:一份公式,整列自动应用。
但如果你不小心把公式写成了:
excel复制=ISNUMBER(FIND("科技", $A$2))
那么区域内每个单元格都会判断A2这一个固定的格子。结果就是:A2包含“科技”时,整片A2:A100全亮;A2不包含时,整片都不亮。这个现象很迷惑人,我第一次遇到时以为是规则没刷出来,还关了工作簿重开,结果依旧。
所以记住一条原则:在条件格式公式里,需要“跟着行走的”引用,行号就不要加美元符号;需要“固定不变的”,才加美元符号。
4.2 动态关键词单元格:改一个格子,高亮全表刷新
这是我认为最值得推荐的手法。把关键词放在工作表的某个预留单元格里,条件格式公式引用它,好处是你只需要改一个单元格,整张表的高亮效果就会立即刷新。
比如我在 F1 输入“科技”,然后选中A2:A100,新建规则公式:
excel复制=ISNUMBER(FIND($F$1, $A2))
这里有个细节:$F$1 加了两个美元符号,表示固定引用F1;$A2 只在列上加了美元符号,行号没有加,这样公式在每一行会分别判断A2、A3、A4……。
想换关键词时,直接改F1里的文字,“科技”换成“贸易”,高亮区域马上变样。这套做法特别适合做临时性的数据筛查,别人看起来会觉得你像是在操作一个简单的小工具。
4.3 空关键词的陷阱:全表高亮是怎么发生的
动态关键词虽然好用,但有一个隐蔽的坑:F1清空后,整张表可能全部被高亮。原因在于 FIND("", A2) 并不会报错,它会返回1,因为空字符串在任何文本里都算出现了一次。于是 ISNUMBER(FIND("",A2)) 返回 TRUE,条件成立,所有单元格都被标上颜色。
想避免这种“全亮”情况,公式里就要加一个空值判断:
excel复制=AND($F$1<>"", ISNUMBER(FIND($F$1, $A2)))
AND 要求两个条件同时成立:关键词不能为空,同时文本里确实包含这个关键词。这样清空F1后,规则会整体不生效,而不是高亮全部。
这个坑我自己踩过不止一次。有一次给同事演示动态看板,为了显示“没有任何关键词”的效果,我清空了F1,结果整列数据全部变红,场面一度很尴尬。从那以后,凡是动态关键词,我都会把空值保护写进公式里,已经成了肌肉记忆。
4.4 整行高亮:判断A列,点亮整行
很多实际业务中,你要标亮的不只是一个单元格,而是整行。比如“属于重点客户的订单,整行标黄”“状态异常的记录,整行标红”。整行高亮的写法,其实核心就是引用规则的正确运用。
假设数据从A2到E100,判断依据是A列的公司名称,要让整行变色:
- 选中A2:E100。
- 新建条件格式规则。
- 公式写
=ISNUMBER(FIND("科技", $A2))。 - 设置填充色。
注意,这里判断列的写法是 $A2,列方向绝对定位,行方向相对定位。这样无论公式被复制到 B2、C2、D2还是E2,$A2 都仍然指向当前行的A列。于是整行只要A列满足条件,这一行的所有单元格都满足同一个条件,整行填色就实现了。
如果是动态关键词,公式就变成:
excel复制=AND($F$1<>"", ISNUMBER(FIND($F$1, $A2)))
再配合整行应用,就是一个非常完整、可交互的高亮方案:左边改关键词,右边整行变色,和看板一样。
5. 多关键词组合与订单高亮实战:一个完整案例的搭建复盘
5.1 多关键词“任一命中”的公式
实际工作里,很少只高亮一个关键词。更常见的是:只要包含这批关键词中的任意一个,就标出来。比如高亮所有备注里出现过“退货”或“差评”的记录,这时候可以用 OR 组合多个 ISNUMBER(FIND(...)):
excel复制=OR(ISNUMBER(FIND("退货", $E2)), ISNUMBER(FIND("差评", $E2)))
如果关键词数量多,公式会变得很长。这时可以用数组常量
