ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Excel多关键词筛选实战:从高级筛选到Power Query的自动化方案

Excel多关键词筛选实战:从高级筛选到Power Query的自动化方案 很多时候我们处理表格数据并不是为了看得懂而是为了从一大片数据里“捞”出符合条件的那几行。比如运营同学每天要从订单备注里找出“退款、投诉、售后”的订单技术同学要从服务日志里筛出包含“ERROR、TIMEOUT、OOM”的行财务同学要从往来单位里把多个重点客户名单单独拎出来。这件事看起来简单实际做起来却很折腾。大多数人还在用最原始的方式打开筛选输入一个关键词复制结果再打开筛选输入第二个关键词再复制……最后手动去重、拼接。数据量小的时候还能接受数据一多、关键词一多效率极低还容易漏数据。更麻烦的是下周数据更新了所有操作又要重新来一遍。这篇文章的核心判断是多关键词筛选真正该做的不是“把筛选操作做得更快”而是把“数据”和“关键词条件”分开让表格工具一次性完成匹配逻辑。这样关键词维护区一变结果自动更新才叫一劳永逸。下面我会从 Excel/WPS 的多种方案讲起覆盖高级筛选、公式辅助列、FILTER 动态数组、Power Query再补充 SQL 和 pandas 场景最后给出排查方法和工程建议。读者可以根据自己的数据量、软件版本和更新频率选择最适合的一套方案。1. 这篇文章真正要解决的问题先说我见过最多的手工操作方式。默认情况下Excel 的自动筛选一次只能响应一个条件。假设你要筛选“名称列中包含华为、腾讯、阿里之一”的所有行操作路径通常是打开“名称”列的自动筛选。文本筛选 → 包含 → 输入“华为” → 确定。把筛选出来的行复制到新工作表。再打开筛选清空条件。文本筛选 → 包含 → 输入“腾讯” → 确定。复制结果再合并去重。对“阿里”再重复一遍。如果关键词有 10 个就要重复 10 次。如果原始数据有 10 万行光是复制和筛选就会让人崩溃。而且这种操作非常依赖注意力多一步、少一步结果就可能缺数据。这种痛点主要集中在几类场景订单备注筛选包含“退款、投诉、售后、差评”的订单。日志分析筛选包含“ERROR、TIMEOUT、OOM、Exception”的报错行。客户名单从几百家客户中筛出多个重点客户名称。商品库按多个品牌或型号关键词过滤商品。文本内容审核从备注、评论、标题中找出多组敏感词。这些场景有一个共同点数据是持续增长的关键词也会变但筛选规则是固定的“包含任意一个关键词”。只有把这套规则沉淀下来才能减少重复劳动。读完这篇文章你应该能回答三个问题自己的 Excel/WPS 版本支持哪种方案。如何把“关键词列表”变成参数区而不是散落在筛选框里。当数据量变大后怎么平滑迁移到 Power Query 或程序化方案。2. 多关键词筛选的基本概念与方案对比在动手之前先把几个容易混淆的概念说清楚。精确匹配单元格内容和关键词完全相等比如“华为”等于“华为”。模糊匹配 / 包含匹配单元格内容里包含关键词即可比如“华为P40 Pro”也命中“华为”。区分大小写英文环境下“error”和“ERROR”是否等价。通配符Excel 在部分筛选和函数中支持*任意多个字符、?单个字符、~转义符。AND 与 OR多关键词之间是“同时包含”还是“包含任意一个”。本文主要讨论的是“包含任意一个关键词”的场景。这是日常需求里最普遍的一种也是最难手工处理的一种。下面先给一张方案对比表。它决定了你后面选择哪条路。方案是否需要写公式自动更新适合数据量版本要求普通自动筛选否否每次手工小任意高级筛选否否但可快速重跑中小Excel / WPS辅助列 SUMPRODUCT/COUNTIF是公式自动计算中小Excel 2007 / WPSFILTER 动态数组是自动更新中Excel 365 / 2021Power Query少量 M 代码一键刷新大Excel 2016 / WPSSQL / pandas是脚本运行大开发环境如果你的数据行数不多又不想记公式推荐先用高级筛选。如果你希望改关键词后结果跟着变辅助列公式和 FILTER 更适合。如果数据已经到几万行、几十万行或者你希望以后新增数据后刷新一次就能出结果直接用 Power Query 更省心。3. 方案一Excel 高级筛选先摆脱手动重复高级筛选是 Excel 里被严重低估的功能。它不需要写公式只需要准备一个“条件区域”然后让 Excel 根据条件区域一次性筛选整个数据表。3.1 高级筛选的基本操作假设原始数据在“明细”工作表A 列是“编号”B 列是“名称”C 列是“备注”数据从第 1 行开始第 1 行是表头。操作步骤如下。第一步在数据区域外的空白位置准备条件区域。最规范的做法是把条件区域放在右侧或独立工作表。这里以放在 F1 区域为例F1: 名称 F2: *华为* F3: *腾讯* F4: *阿里*注意条件区域的第一个单元格必须和数据表的表头名称一致。数据表这一列的列名是“名称”条件区域第一行也必须是“名称”。*华为*表示“包含华为”的模糊匹配。第二步选中数据区域内任意一个单元格点击“数据”选项卡 →“排序和筛选”→“高级”。第三步在高级筛选对话框中“方式”选择“在原有区域显示筛选结果”或者“将筛选结果复制到其他位置”。“列表区域”通常会自动填好也可以手动选$A$1:$C$1000。“条件区域”选择$F$1:$F$4一定要包含条件区域的标题行。如果选了“复制到其他位置”在“复制到”选择一个空白单元格比如$H$1。点击“确定”后就会得到一个只包含“名称列命中任意一个关键词”的结果。3.2 条件区域的 AND 与 OR 规则高级筛选条件区域的精髓在于行列关系同一行的条件是 AND 关系必须同时满足。不同行的条件是 OR 关系满足任意一行即可。所以如果要筛选“名称包含华为且备注包含售后”的数据条件区域这样写名称 备注 *华为* *售后*如果只是筛选“名称包含华为、腾讯、阿里之一”就像前面例子一样把所有条件写在“名称”列的不同行。通配符方面*表示任意多个字符?表示单个字符。如果你要匹配的关键词本身就包含*或?比如型号是A*B要用~*转义写成*A~*B*才能按普通字符处理。3.3 高级筛选的优缺点高级筛选的最大价值是让你不再一次一次地输入筛选关键词。条件区域保留下来以后下次新增或删除关键词只需要改条件区域里的内容再重新执行一次高级筛选即可。它的问题是“重跑”不是“自动更新”。数据表新增行之后列表区域如果选择的是固定区域新数据不会自动纳入需要手动调整区域范围。另外如果数据表里存在整行隐藏、合并单元格、表头重复等问题筛选结果也会异常。所以我的判断是高级筛选适合临时任务、快速处理、不想写公式的场景。如果你经常做同样的筛选建议继续看方案二和方案三。4. 方案二辅助列 SUMPRODUCT/COUNTIF兼容性最强的自动方案高级筛选解决了“重复点击”的问题但没有真正实现“关键词一变结果就变”。如果你希望把关键词放在一个参数区改一个词所有结果立刻重新计算辅助列公式是目前兼容性最高的方案。4.1 准备关键词参数区在“明细”工作表右侧的 F 列维护一个关键词列表F1: 关键词 F2: 华为 F3: 腾讯 F4: 阿里建议把这个区域做成一个独立的矩形区域不要留空行。因为公式中引用了整个F2:F10如果中间有空单元格匹配逻辑会出错。如果条件允许建议把关键词放到单独的“参数”工作表这样后续维护更清晰。公式里跨表引用比如参数!$A$2:$A$104.2 在数据表旁边添加辅助列假设数据表的列是 A、B、C名称在 B 列。在 D2 单元格输入下面的公式SUMPRODUCT(--ISNUMBER(SEARCH($F$2:$F$10, B2)))0这个公式的含义是SEARCH($F$2:$F$10, B2)依次判断 B2 是否包含 F2:F10 里的每个关键词如果包含返回关键词在文本中的位置数字不包含返回#VALUE!错误。ISNUMBER(...)把位置数字转换为TRUE错误值转换为FALSE。--把TRUE/FALSE转换为1/0。SUMPRODUCT(...)把结果求和。如果 B2 命中了任意一个关键词求和结果大于 0。0最终得到TRUE/FALSE。如果你更习惯用 COUNTIF还有一个等效公式SUMPRODUCT(--COUNTIF(B2, *$F$2:$F$10*))0COUNTIF 的写法本质上利用了通配符匹配逻辑更直观。但它有一个小坑如果关键词里本身包含*或?COUNTIF 会优先把它们当通配符处理导致匹配结果异常。相比之下SEARCH 版本把关键词当普通文本处理更稳妥所以实际项目中我更推荐 SEARCH 版本。输入公式后把 D2 向下填充到数据末尾。然后对 D 列启用自动筛选筛选条件为TRUE就能得到所有匹配的行。4.3 注意事项公式中的$F$2:$F$10是关键词区域按实际情况修改。关键词区域建议多预留几行比如F2:F50方便以后增加关键词。如果不想让辅助列留在最终结果里筛选出结果后可以隐藏 D 列或者把结果复制到新工作表。默认的 SEARCH 不区分大小写。如果业务上要求区分大小写把SEARCH改成FIND即可。如果要判断整行多列是否包含关键词可以把多列拼接起来比如SEARCH($F$2:$F$10, A2 | B2 | C2)。辅助列公式的优点是不依赖最新版软件Excel 2007 以上和 WPS 都支持公式会自动重算。缺点是如果数据量超过几万行每个单元格都要执行一次对关键词数组的遍历文件可能会变卡。5. 方案三FILTER 动态数组公式一个公式直接输出结果如果你使用的是 Excel 365、Excel 2021或者新版 WPS 已经支持动态数组函数那么 FILTER 才是真正的“一个公式一劳永逸”。它不需要辅助列也不需要手动筛选结果区域是动态扩散的。5.1 FILTER 函数的基本用法FILTER 的基本语法是FILTER(要返回的数据区域, 筛选条件, [无匹配时的返回值])其中第二个参数“筛选条件”必须是一列逻辑值长度和数据区域的行数一致。所以问题的核心就变成了如何构造一列逻辑值让每一行都表示“是否命中任意一个关键词”。5.2 用 BYROW 聚合多关键词匹配结果假设数据在 A2:C1000名称在 A 列关键词在 F2:F10。在任意空白单元格输入FILTER(A2:C1000, BYROW(ISNUMBER(SEARCH($F$2:$F$10, $A$2:$A$1000)), LAMBDA(r, OR(r))), 无匹配)这个公式看起来有点长拆开看就清晰了。SEARCH($F$2:$F$10, $A$2:$A$1000)把每个关键词和每一行文本做匹配得到一个二维矩阵。ISNUMBER(...)把匹配结果转换为TRUE/FALSE矩阵。BYROW(..., LAMBDA(r, OR(r)))按行遍历矩阵只要某一行存在任意一个TRUE就把该行标记为TRUE。这一步把二维矩阵压缩成了单列逻辑值。FILTER(A2:C1000, 单列逻辑值, 无匹配)根据逻辑值返回数据行如果没有匹配结果则返回“无匹配”。如果你希望同时在多列里查找关键词只需要把 A 列扩成多列拼接的表达式FILTER(A2:C1000, BYROW(ISNUMBER(SEARCH($F$2:$F$10, $A$2:$A$1000 | $B$2:$B$1000 | $C$2:$C$1000)), LAMBDA(r, OR(r))), 无匹配)这样只要“编号、名称、备注”中任何一列包含关键词都会被筛选出来。5.3 使用 FILTER 方案的注意事项首先FILTER 是动态数组函数结果会占用一片连续区域。如果结果区域的右侧或下方有其他非空单元格会返回#SPILL!错误。解决办法是清空目标区域或者把公式放到一个完全空白的区域。其次关键词区域一定不要有空行。因为SEARCH(, 任意文本)会返回 1等于所有关键词被视为空字符串导致每一行都被匹配。最后默认 SEARCH 不区分大小写。需要区分大小写时把公式里的SEARCH改成FIND。FILTER 方案最大的优点是体验好修改关键词区域后不需要任何额外操作结果表会瞬间自动重算。缺点是动态数组函数在旧版 Excel 中不可用。如果公司电脑还是 Excel 2016建议使用方案二。6. 方案四Power Query 参数表适合大数据和重复刷新场景当数据量达到几万行甚至几十万行或者你需要每周、每天重复处理相同结构的新数据用公式可能变得很慢。这时候我更推荐 Power Query。Power Query 是 Excel 内置的数据清洗和转换工具微软的 Power BI 也在用同一套引擎。它会把“筛选过程”保存为一个查询每次只需要点一下“刷新”就能用最新数据和最新关键词重新计算。6.1 把原始数据和关键词区域转成表格Power Query 读取的数据源最好是“Excel 表格”而不是普通区域。因为表格有自动扩展结构以后新增行刷新时能自动识别。选中原始数据区域按CtrlT弹出“创建表”对话框确定。然后在“表格工具”里把表名改成tbl_Data。选中关键词区域同样按CtrlT转成表格表名改成tbl_Keywords并保证第一列列名为“关键词”。表名前不要乱加空格命名规范一点后面 M 代码引用才不会出错。6.2 在 Power Query 中建立匹配逻辑在“数据”选项卡中点击“从表格/区域”把tbl_Data加载进 Power Query 编辑器。接着再把tbl_Keywords也加载进来。你不需要把关键词表加载到工作表它只需要作为查询存在。在右侧“查询”面板确认两个查询都在。然后在tbl_Data查询中点击“添加列”→“自定义列”输入 List.Any(List.Transform(tbl_Keywords[关键词], (k) Text.Contains([商品名称], k, Comparer.OrdinalIgnoreCase)))解释一下这段 M 逻辑tbl_Keywords[关键词]获取关键词查询的那一列数据形成一个列表。List.Transform(...)遍历关键词列表对每个关键词执行Text.Contains判断判断该行“商品名称”是否包含关键词。Comparer.OrdinalIgnoreCase让匹配不区分大小写。如果业务要求区分大小写去掉这个参数即可。List.Any(...)只要列表中有任意一个判断为TRUE整行就匹配成功。自定义列创建后筛选“匹配标记”列只保留TRUE的行然后删除“匹配标记”辅助列最后点击“关闭并上载”把结果放回工作表。6.3 Power Query 完整 M 代码参考如果你熟悉高级编辑器可以直接把下面代码替换到tbl_Data查询的高级编辑器中。但注意列名、表名必须和你的实际情况一致否则会报错。let 源 tbl_Data, 添加匹配标记 Table.AddColumn( 源, 匹配标记, each List.Any( List.Transform( tbl_Keywords[关键词], (k) Text.Contains(Text.From([商品名称]), k, Comparer.OrdinalIgnoreCase) ) ), type logical ), 筛选匹配行 Table.SelectRows(添加匹配标记, each [匹配标记] true), 删除辅助列 Table.RemoveColumns(筛选匹配行, {匹配标记}) in 删除辅助列这段代码做的事和界面操作完全一样。后续如果原始数据新增了行、关键词区域新增了关键词只需要在 Excel 中点击“数据”→“全部刷新”结果表就会重新计算。6.4 Power Query 方案的边界Power Query 虽然强大但有几个常见坑。一是表名和列名改了以后旧查询会失效。特别是团队合作时有人把“商品名称”列改成了“名称”刷新就会报错。二是关键词表和原始数据表必须都在工作簿中或者都是 Power Query 能访问的数据源。如果你删除关键词表刷新会失败。三是 Power Query 默认的Text.Contains区分大小写关键词“error”匹配不到“ERROR”。要忽略大小写需要用Comparer.OrdinalIgnoreCase。如果你的工作流是“每天导出一份新数据 → 清洗 → 筛选”Power Query 的价值会非常明显。它把整个步骤固化成一个模板后续只是刷新。7. 进阶延伸SQL 与 pandas 中的多关键词筛选除了 Excel / WPS很多读者处理的数据其实在数据库里或者已经用 Python 做分析。这里补充两套等价写法。7.1 SQLLIKE 多条件与正则如果把“关键词列表”放到一张表里最直接的 SQL 写法是多个 LIKE 条件做 OR 连接SELECT * FROM sales WHERE product_name LIKE %华为% OR product_name LIKE %腾讯% OR product_name LIKE %阿里%;这个写法直观但关键词数量一多SQL 会变得很长维护困难。如果数据库支持正则表达式比如 MySQL 或 SQLite可以写成SELECT * FROM sales WHERE product_name REGEXP 华为|腾讯|阿里;MySQL 中的REGEXP对中文也能正常工作。这样关键词列表就是一行字符串用英文竖线|分隔。对于 SQL Server本身没有内置的REGEXP函数建议还是用多个 LIKE 条件或者在关键词数量过多时考虑全文索引方案。这里不展开因为不同数据库版本差异较大。7.2 pandas在 Python 中实现多关键词筛选pandas 是 Python 数据分析最常用的库。多关键词筛选可以借助str.contains完成。import pandas as pd import re df pd.read_excel(销售数据.xlsx) keywords [华为, 腾讯, 阿里] # 对关键词做正则转义避免关键词中的 . ( ) 等字符被当成正则元字符 pattern |.join(re.escape(k) for k in keywords) # caseFalse 忽略大小写naFalse 让缺失值不报错 result df[df[商品名称].astype(str).str.contains(pattern, caseFalse, naFalse)] print(result)这里有两个细节值得注意。第一str.contains默认接受正则表达式。如果关键词包含(、)、.、*等特殊字符必须用re.escape(k)转义。否则“v1.2”会被解释成“v1 加任意字符加 2”匹配结果不符合预期。第二caseFalse表示忽略大小写。如果业务要求区分大小写把该参数改成caseTrue。如果还想进一步把筛选结果保存为 Excel可以在末尾加一行result.to_excel(筛选结果.xlsx, indexFalse)pandas 方案更适合已经进入 Python 工作流、或者需要把筛选嵌套进自动化任务里的场景。8. 常见问题与排查思路下面是多关键词筛选中最常见的几个问题按现象列出了排查路径。问题现象可能原因排查方式解决方案高级筛选结果为空条件区域表头与数据表头不一致或条件区域包含空行检查条件区域第一行和值区域统一表头名称重建条件区域关键词明明存在却筛不出来单元格有不可见空格、换行符或大小写不一致用LEN和CLEAN检查文本长度先用TRIM、CLEAN清洗数据COUNTIF 公式把*?当成通配符关键词本身包含*、?等特殊符号查看关键词内容改用 SEARCH/ISNUMBER 方案或用~*转义FILTER 返回#SPILL!公式结果区域已经被其他内容占用查看溢出提示黄色框清空目标区域或移动公式位置FILTER 返回#CALC!没有匹配到任何数据检查关键词和数据是否确实匹配给 FILTER 加第三个参数“无匹配”Power Query 刷新失败表名、列名被修改或引用的查询不存在打开查询查看错误步骤在名称管理器和查询面板核对名称数据更新后结果没变没有触发刷新点击“数据 → 全部刷新”建立刷新习惯或设置自动刷新公式下拉后新增行没自动计算普通区域不会自动扩展观察公式填充范围将数据区域转换为 Excel 表格公式列自动扩展关键词区域有空行导致全部匹配SEARCH(, 文本)返回 1查看关键词区域是否有空单元格删除空行或预留区域只写实际关键词排查顺序建议是先看数据源本身有没有脏数据再看条件区域的引用是否准确最后看函数版本支持和溢出冲突。大部分问题都出在前两类。9. 最佳实践与工程建议多关键词筛选看起来是个小功能但在真实项目里能不能稳定用起来关键看细节。下面几条建议来自实际表格项目的通用经验。第一把关键词参数区独立出来。不要写在数据表旁边容易被误删的位置最好单独放一个“参数”工作表并在旁边备注好用法。比如在A1写“在此列输入要筛选的关键词”团队其他成员改起来没有压力。第二用 Excel 表格而不是普通区域。数据区域按CtrlT转为表格后公式和 Power Query 都能自动识别新增行。这是“数据会自动更新”的重要前提也是很多筛选公式后来失效的根源。第三命名规范要一致。Excel 表格命名用tbl_Data、tbl_Keywords这种前缀Power Query 查询命名保持一致。公式引用参数区时可以使用“名称管理器”给关键词区域定义一个名称比如kw_List。这样公式可读性会好很多。第四公式要防错。数据区域如果有空值、非文本值公式可能返回错误。可以在外层包一层IFERROR或者统一把数据列做一次TEXT()转换。对于 pandas / SQL 方案还需要处理缺失值和特殊字符。第五关注性能。Excel 公式方案不要全列引用比如A:A会导致整列计算文件会卡。数据量超过 5 万行时优先考虑 Power Query。Power Query 在数据量增大时表现更稳定而且不会拖慢打开文件的速度。第六注意数据安全。表格如果包含客户隐私、业务敏感字段不要随手把文件丢到不可控的在线工具里处理。本地 Excel / WPS 或公司内部平台的方案更稳妥。如果需要团队共享模板尽量在环境可控的渠道分发。第七把方案模板化。当某套筛选流程验证稳定后把原始数据区域、关键词参数区域、输出区域都整理成固定模板。以后每次只需要替换原始数据刷新即可得到结果。这比每次都重新搭建公式要高效得多。10. 总结与后续学习方向回到最初的问题全表同时筛选多个关键词为什么不能继续手动因为手动筛选的本质是在重复执行机器应该帮你记住的逻辑。高频、重复、易错的操作都值得沉淀成模板或脚本。这篇文章覆盖了四条完整路径高级筛选适合不写公式、临时快速处理。辅助列 SUMPRODUCT/SEARCH兼容性最好适合 Excel 2007 以上和 WPS。FILTER 动态数组适合 Excel 365 / 2021结果自动刷新体验最好。Power Query适合大数据量和周期性刷新场景。程序化方案里SQL 用LIKE和REGEXPpandas 用str.contains。它们适合日常在处理数据库或 Python 项目中使用。如果你现在的数据量不大建议先跑通辅助列公式理解“关键词参数区 匹配判断”的思路再逐步尝试 FILTER 和 Power Query。建议收藏这篇文章下次需要搭建类似模板时直接照着操作能省不少时间。真正的“一劳永逸”不是找到一个神秘功能而是建立一套“数据更新、条件更新、结果跟着更新”的机制。先把最小案例跑通再把方案固化到日常工作流里后面就是一次次刷新而已。
返回列表