自在学

我们与你共同进步

  • 分类课程
  • 文章
  • 工作台
  • 订阅

  • 关于我们
  • 隐私政策
  • 使用条款

探索

  • 分类课程
  • 文章
  • 工作台
  • 订阅

网站信息

  • 关于我们
  • 隐私政策
  • 使用条款

加入社区

自在学学习社区微信二维码

微信扫码,交流学习

株洲市自在学教育科技有限公司© 2025 - 2026 版权所有

© 2025 - 2026 株洲市自在学教育科技有限公司 版权所有

湘公网安备43020302000292号|湘ICP备2025148919号-1
分类课程工作台文章订阅
分类课程工作台文章价格

Excel入门

  1. 01认识 Excel
  2. 02Excel 的基本操作
  3. 03Excel 高效办公
  4. 04表格的样式与编辑
  5. 05数据的处理
  6. 06公式介绍
  7. 07基础函数
  8. 08统计函数
  9. 09逻辑函数
  10. 10日期与时间函数
  11. 11文本函数
  12. 12查找函数与 Subtotal 函数
  13. 13超级表
  14. 14图表的使用
  15. 15数据透视表
  16. 16打印和保护
正在加载课程章节内容
课程通用技能Excel入门查找函数与 Subtotal 函数

查找函数与 Subtotal 函数

表格越大,“找数据”这件事就越费劲。人事拿着一个工号要在几百行的员工表里翻出对应的月薪,采购要按订货数量在折扣表里对出该用几折结算,客服要从一长串邮箱地址里截出用户名,销售主管筛选出华东区的订单后还想看一眼筛选结果的金额小计。这些需求靠眼睛扫、靠 Ctrl+F 一个个搜,数据一多就顶不住了。本章介绍两类专门解决这些问题的函数:一类是查找定位函数——VLOOKUP、MATCH、FIND、SEARCH,负责在表格和文本中把目标“捞”出来;另一类是 SUBTOTAL,负责在筛选和隐藏行的场景下做只统计可见数据的汇总。


VLOOKUP 函数

VLOOKUP 是 Excel 中使用频率最高的查找函数。它的工作方式是:拿一个值,去一个区域的第一列里从上往下找,找到后返回同一行中指定列的内容。

函数语法:

text
 
=VLOOKUP(查找值, 查找区域, 返回列号, 匹配方式)
 
参数含义示例
查找值拿什么去找“GH007” 或单元格引用 G2
查找区域去哪个区域找(查找值必须在区域第一列)A2:E11
返回列号找到后返回区域中第几列的内容5(区域的第 5 列)
匹配方式0 或 FALSE 为精确匹配,1 或 TRUE 为近似匹配0

查找值必须位于查找区域的第一列。VLOOKUP 只能“从左往右”返回——如果要返回的内容在查找列的左边,VLOOKUP 无能为力,需要用后面介绍的 INDEX 加 MATCH 组合。

精确查找:按工号查月薪

练习文件的“员工工资表”中,A1:E11 存放了 10 名员工的信息:

工号姓名部门岗位月薪
GH001张伟技术部前端工程师15000
GH002李娜市场部策划专员9500
GH003王磊技术部后端工程师16000
GH004赵敏人事部招聘主管11000
GH005陈亮财务部会计10500
GH006刘洋市场部市场经理14000
GH007孙倩技术部测试工程师12000
GH008周涛行政部行政专员7500
GH009吴静财务部财务主管13500
GH010郑凯市场部渠道专员8800

现在要查工号 GH007 的月薪。G2 中输入查询工号“GH007”,在 H2 中写公式:

text
 
=VLOOKUP(G2, A2:E11, 5, 0)
 

公式的执行过程:拿 G2 中的“GH007”,到 A2:A11(查找区域的第一列)从上往下找,在第 7 行找到;月薪在区域的第 5 列,于是返回该行第 5 列的值 12000。

第四个参数写 0,表示精确匹配——工号必须一模一样才算找到。查工号、查姓名、查产品编码这类场景,一律用精确匹配。

VLOOKUP精确查找按工号返回月薪

点击下载模板:VLOOKUP查找-练习模板.xlsx

近似查找:按采购数量匹配折扣率

第四个参数写 1 或 TRUE 时,VLOOKUP 变成近似匹配:找不到完全相等的值时,返回小于等于查找值的最大值所在行。这种模式专门用来做“区间匹配”。

“产品价格表”的 E1:F5 是一张阶梯折扣表,采购数量越大折扣越低:

采购数量下限折扣率
11
500.95
1000.9
5000.85

客户这次要采购 120 件,H2 中输入数量 120,在 I2 中写公式:

text
 
=VLOOKUP(H2, E2:F5, 2, TRUE)
 

区间表里没有 120 这个值,近似匹配返回小于等于 120 的最大值——也就是 100 那一行,结果是 0.9,按九折结算。如果采购 49 件,小于等于 49 的最大值是 1,返回 1,不打折。

近似匹配要求查找区域的第一列必须按升序排列。上面的区间表是 1、50、100、500 从小到大排的,所以结果正确;如果顺序打乱,VLOOKUP 不会报错,但返回的折扣率是错的。这种“不报错但结果错”的问题比 #N/A 更难发现。

VLOOKUP近似匹配按采购数量返回折扣率

点击下载模板:VLOOKUP区间匹配-练习模板.xlsx

常见错误:#N/A 的排查

VLOOKUP 用得多,翻车也多。最常见的错误是 #N/A——精确匹配模式下在第一列没找到查找值。逐条排查:

原因表现解决办法
查找值确实不存在工号写错或员工已离职用 Ctrl+F 先手动搜一下确认
数字格式不一致一边是数值 1001,一边是文本 “1001”用“分列”功能统一格式,或用 VALUE/TEXT 转换
数据里藏着空格“GH007 ”末尾多了个空格,肉眼看不出查找值套一层 TRIM 函数去空格
区域没锁定就下拉公式下拉后 A2:E11 变成了 A3:E12,区域跑偏查找区域用绝对引用 AAA2:EEE11

另一个高频失误是第四个参数漏写。参数省略时默认为近似匹配,如果数据没排序,公式会安静地返回错误行的数据,全程不报错。养成习惯:只要是精确查找,第四个参数明确写 0。

找不到时不想看到 #N/A 刺眼地趴在报表里,可以用 IFERROR 包一层:

text
 
=IFERROR(VLOOKUP(G2, A2:E11, 5, 0), "未找到")
 

查不到时单元格显示“未找到”,不影响后续的求和统计。


MATCH 函数

VLOOKUP 返回的是找到的“值”,MATCH 返回的是找到的“位置”——目标在区域中排第几个。

函数语法:

text
 
=MATCH(查找值, 查找区域, 匹配方式)
 

查找区域只能是一行或一列。匹配方式与 VLOOKUP 类似:0 为精确匹配,1 为近似匹配(要求升序,默认值),-1 为近似匹配(要求降序)。日常使用几乎都写 0。

还是员工工资表,G5 中输入姓名“孙倩”,在 H5 中写公式:

text
 
=MATCH(G5, B2:B11, 0)
 

结果是 7——孙倩在 B2:B11 这一列的第 7 个位置。注意返回的是相对位置而不是行号:区域从 B2 开始数,所以第 7 个对应的是工作表第 8 行。

单独一个位置数字用处有限,MATCH 的真正价值在于给别的函数“导航”。

与 VLOOKUP 配合:反向查找

VLOOKUP 有个硬限制:只能从查找列往右返回。员工表里工号在 A 列、姓名在 B 列,“按工号查姓名”没问题,反过来“按姓名查工号”就卡住了——工号在姓名的左边。

INDEX 加 MATCH 的组合不受方向限制。INDEX 的作用是“从区域里取第几个”,MATCH 负责算出“第几个”:

text
 
=INDEX(A2:A11, MATCH(G5, B2:B11, 0))
 

在 I5 中输入这个公式,执行分两步:MATCH 先在 B2:B11 中找到“孙倩”的位置 7,INDEX 再从 A2:A11 中取出第 7 个值,返回 GH007。查找列在左在右都无所谓,两个区域行数对齐就行。

MATCH定位姓名位置并配合INDEX反查工号

点击下载模板:MATCH定位-练习模板.xlsx

MATCH 还有一个常见用法是给 VLOOKUP 的第三个参数“返回列号”导航。表格列很多时,手动数“月薪是第几列”容易数错,可以写成 =VLOOKUP(G2, A2:E11, MATCH("月薪", A1:E1, 0), 0),让 MATCH 自动算出“月薪”在标题行的第 5 列。以后表格插入新列,公式也不会失效。


FIND 与 FINDB 函数

VLOOKUP 和 MATCH 在单元格之间找,FIND 在一个单元格内部的文本里找——返回一段字符在另一段字符中第一次出现的位置。

函数语法:

text
 
=FIND(要找的文本, 在哪找, 起始位置)
 

第三个参数可省略,省略时从第 1 个字符开始找。找不到时返回 #VALUE! 错误。

“文本查找”工作表的 A 列存放客户邮箱。邮箱地址的用户名长度不固定,没法用固定位数的 LEFT 直接截取,但“@”符号的位置可以用 FIND 定位。A2 是 linda2024@example.com,在 B2 中写公式:

text
 
=FIND("@", A2)
 

结果是 10——“@”是第 10 个字符。位置有了,用户名就是“@”前面的 9 个字符,配合 LEFT 提取,在 C2 中写:

text
 
=LEFT(A2, FIND("@", A2) - 1)
 

结果是“linda2024”。公式下拉后每一行都按自己的“@”位置截取,长短不一的邮箱全部处理正确。这套“FIND 定位+LEFT/MID 提取”的组合,是处理不定长文本的标准做法。

FINDB 是 FIND 的字节版。FIND 把每个字符都数成 1,FINDB 把中文字符数成 2 个字节、英文和数字数成 1 个字节。D2 是“销售部张伟Zhang Wei”,对比两个函数找大写“Z”的结果:

text
 
=FIND("Z", D2)
 

返回 6——前面有 5 个汉字,“Z”是第 6 个字符。

text
 
=FINDB("Z", D2)
 

返回 11——5 个汉字占 10 个字节,“Z”从第 11 个字节开始。日常场景用 FIND 就够了,FINDB 只在需要按字节处理中英混合文本时出场,下一节会看到它的搭档 SEARCHB 的实际用法。


SEARCH 与 SEARCHB 函数

SEARCH 的语法和 FIND 完全相同:

text
 
=SEARCH(要找的文本, 在哪找, 起始位置)
 

两个函数的差别只有两点,但正是这两点决定了什么时候该用谁:

对比项FINDSEARCH
大小写区分不区分
通配符不支持支持 ?(任意单个字符)和 *(任意一串字符)
找不到时#VALUE!#VALUE!
字节版本FINDBSEARCHB

先看大小写。某单元格的内容是“Excel入门Ch12.xlsx”,要找“ch”:

text
 
=FIND("ch", "Excel入门Ch12.xlsx")
 

返回 #VALUE!——FIND 区分大小写,文本里只有大写开头的“Ch”,没有小写的“ch”。换成 SEARCH:

text
 
=SEARCH("ch", "Excel入门Ch12.xlsx")
 

返回 8,“Ch”在第 8 个字符的位置被匹配到。查英文内容时大小写往往不重要,这种情况直接用 SEARCH 更省心。

再看通配符。A7 的邮箱是 vip.club@mail.cn,用“m?il”找:

text
 
=SEARCH("m?il", A7)
 

问号匹配任意一个字符,“mail”符合这个模式,返回 10。如果要找的就是问号或星号本身,在字符前加波浪号,写成~?/~*。

SEARCHB 按字节计数且支持通配符,两个特性合起来能解决一个实际问题:从中英混合的文本里把英文部分提出来。D 列的联系人信息是“部门+中文姓名+英文姓名”连在一起的,比如 D2 的“销售部张伟Zhang Wei”,中英文之间没有分隔符,英文起始位置也不固定。在 E2 中写公式:

text
 
=MIDB(D2, SEARCHB("?", D2), LEN(D2) * 2 - LENB(D2))
 

结果是“Zhang Wei”。拆开看这个公式:SEARCHB("?", D2) 用单字节通配符找到第一个英文字符的字节位置 11(前面 5 个汉字占 10 个字节);LEN(D2)\*2-LENB(D2) 算出英文部分的字节长度——D2 共 14 个字符、19 个字节,14×2−19=9,正好是“Zhang Wei”的字节数;MIDB 从第 11 个字节开始截取 9 个字节,英文姓名就出来了。公式下拉,每行的英文姓名全部提取成功。

FIND定位邮箱@符号与SEARCHB提取英文姓名

点击下载模板:FIND与SEARCH-练习模板.xlsx

选函数的判断顺序很简单:需要区分大小写,用 FIND;需要通配符做模糊查找,用 SEARCH;需要按字节处理中英混合文本,换成对应的 FINDB 或 SEARCHB。语法四个函数完全一样,记住一个就等于记住了四个。


SUBTOTAL 函数

月底对账时有个很典型的场景:销售流水表筛选出“华东”区域的订单后,想看筛选结果的金额合计。如果直接用 SUM,会发现结果纹丝不动——SUM 不管行是不是被筛选隐藏了,照单全收。SUBTOTAL 就是为这种场景准备的:它只统计可见的行。

函数语法:

text
 
=SUBTOTAL(功能代码, 数据区域)
 

第一个参数是功能代码,决定 SUBTOTAL 做哪种计算。常用代码对照:

功能代码(含手动隐藏行)功能代码(忽略手动隐藏行)对应函数计算内容
1101AVERAGE平均值
2102COUNT数值计数
3103COUNTA非空计数
4104MAX最大值
5105MIN最小值
9109SUM求和

“销售流水”工作表的 A1:E13 是 6 月的 12 笔订单,金额合计 48397 元。表格下方 E15 和 E16 分别写了两个公式:

text
 
=SUBTOTAL(9, E2:E13)
 
text
 
=SUM(E2:E13)
 

没有筛选时,两个公式都返回 48397,看不出差别。给 A1:E13 加上筛选,把区域筛成“华东”——可见的只剩 5 笔订单,这时 E15 的 SUBTOTAL 变成 22080(1780+7495+2985+7188+2632),E16 的 SUM 依然是 48397。筛掉的行 SUBTOTAL 自动排除,SUM 全部算进去,这就是两者的根本区别。

SUBTOTAL在筛选华东区域后只统计可见行金额

点击下载模板:SUBTOTAL筛选小计-练习模板.xlsx

9 与 109 的区别

代码 9 和 109 都是求和,差别在对“手动隐藏”的行的态度上。行被隐藏有两种方式:一种是筛选筛掉的,另一种是选中行右键“隐藏”手动藏起来的。两种代码的处理规则:

隐藏方式SUBTOTAL(9, ...)SUBTOTAL(109, ...)
筛选筛掉的行不统计不统计
右键手动隐藏的行统计不统计

筛选场景下用 9 还是 109 结果一样。区别出现在手动隐藏时:比如领导要求汇总时暂时剔除某几笔待核实的订单,把那几行右键隐藏后,SUBTOTAL(9, ...) 的结果不变,SUBTOTAL(109, ...) 的结果会把隐藏行扣掉。要做“所见即所得”的汇总——看到多少算多少——用 109 更符合直觉。

SUBTOTAL 还有一个贴心的特性:它会自动忽略数据区域里其他 SUBTOTAL 公式的结果。分部门做了多个小计行之后,在最底部再写一个 SUBTOTAL 算总计,中间的小计行不会被重复累加。用 SUM 做同样的事就会把小计也加进去,总计直接翻倍。

SUBTOTAL 只对“行”的隐藏生效,是为垂直数据设计的。如果数据横着排、需要忽略隐藏的列来求和,SUBTOTAL 帮不上忙。日常表格尽量按“一行一条记录”的竖排结构组织数据,这也是所有筛选、统计功能的前提。

本章的几个函数各管一段:VLOOKUP 在表格里按值找值,MATCH 找位置并给 INDEX、VLOOKUP 导航,FIND 和 SEARCH 深入单元格内部定位字符,SUBTOTAL 负责筛选和隐藏之后的“可见汇总”。把它们组合起来,“从大表里捞数据、对文本做拆解、对筛选结果做小计”这三类日常需求就都有了标准解法。

上一章文本函数下一章超级表