Excel高级函数应用
本章概览
掌握高级函数是Excel从入门到精通的关键一步。本章将深入讲解查找引用、逻辑判断、数组公式等高级函数的应用,帮助你解决复杂的数据处理问题。
学习目标
- 精通VLOOKUP/XLOOKUP等查找函数
- 掌握IF系列逻辑函数的嵌套应用
- 学会数组公式和动态数组
- 熟练运用INDEX/MATCH组合
- 掌握SUMIFS/COUNTIFS等多条件函数
23.1 查找引用函数
23.1.1 VLOOKUP函数
语法
=VLOOKUP(查找值, 数据表, 列号, [匹配模式])
参数说明
- 查找值:要查找的内容
- 数据表:查找范围
- 列号:返回第几列的值
- 匹配模式:0或FALSE(精确匹配),1或TRUE(近似匹配)
基础示例
# 查询产品价格
A B
1 产品 价格
2 苹果 5
3 香蕉 3
4 橙子 4
# 在E2查询"香蕉"的价格
=VLOOKUP("香蕉",A2:B4,2,0) → 3
=VLOOKUP(D2,A2:B4,2,0) # D2单元格="香蕉"
注意事项
- 查找值必须在数据表第一列
- 列号从1开始计数
- 匹配模式0(精确)vs 1(近似)
- 数据表使用绝对引用:$A$2:$B$4
常见错误
# #N/A错误:找不到值
=IFERROR(VLOOKUP(D2,A2:B4,2,0),"未找到")
# #REF!错误:列号超出范围
=VLOOKUP(D2,A2:B4,3,0) # 错误!只有2列
近似匹配应用
# 成绩等级查询
分数 等级
0 不及格
60 及格
70 中等
80 良好
90 优秀
=VLOOKUP(85,分数表,2,1) → "良好"
# 注意:数据必须升序排列
23.1.2 HLOOKUP函数
语法
=HLOOKUP(查找值, 数据表, 行号, [匹配模式])
应用场景 横向查找(数据按行排列)
示例
A B C D
1 产品 苹果 香蕉 橙子
2 价格 5 3 4
3 库存 100 80 60
=HLOOKUP("香蕉",A1:D3,2,0) → 3 (价格)
=HLOOKUP("香蕉",A1:D3,3,0) → 80 (库存)
23.1.3 XLOOKUP函数(Microsoft 365)
语法
=XLOOKUP(查找值, 查找数组, 返回数组, [找不到时返回值], [匹配模式], [搜索模式])
优势
- 可以向左查找
- 默认精确匹配
- 可设置找不到时的返回值
- 支持反向搜索
基础用法
=XLOOKUP(D2, A2:A10, B2:B10)
# 在A2:A10查找D2,返回B2:B10对应值
找不到时返回默认值
=XLOOKUP(D2, A2:A10, B2:B10, "未找到")
反向查找
# 根据价格查产品名
=XLOOKUP(5, B2:B10, A2:A10) # 向左查找
返回多列
=XLOOKUP(D2, A2:A10, B2:D10) # 返回3列数据
23.1.4 INDEX+MATCH组合
为什么使用INDEX+MATCH
- 比VLOOKUP更灵活
- 可以向左查找
- 列插入删除不影响公式
- 性能更好
基本语法
=INDEX(返回范围, MATCH(查找值, 查找范围, 0))
示例
# 查询产品价格
=INDEX(B2:B10, MATCH("香蕉", A2:A10, 0))
二维查找
=INDEX(数据区域, MATCH(行查找值,行范围,0), MATCH(列查找值,列范围,0))
# 示例:查询"香蕉"在"二月"的销量
A B C D
1 产品 一月 二月 三月
2 苹果 100 120 110
3 香蕉 80 90 100
=INDEX(B2:D3, MATCH("香蕉",A2:A3,0), MATCH("二月",B1:D1,0))
→ 90
优势演示
# VLOOKUP无法实现的场景
# 查询价格对应的产品名(向左查找)
A B
1 产品 价格
2 苹果 5
3 香蕉 3
# 根据价格3查询产品名
=INDEX(A2:A3, MATCH(3, B2:B3, 0)) → "香蕉"
23.2 逻辑函数
23.2.1 IF函数嵌套
单条件判断
=IF(A1>=60, "及格", "不及格")
多条件嵌套
=IF(A1>=90, "优秀",
IF(A1>=80, "良好",
IF(A1>=70, "中等",
IF(A1>=60, "及格", "不及格"))))
嵌套限制
- Excel 2007及以后支持64层嵌套
- 建议不超过7层(可读性)
优化方案 使用IFS函数(Microsoft 365)或VLOOKUP
23.2.2 IFS函数(Microsoft 365)
语法
=IFS(条件1, 值1, 条件2, 值2, ...)
示例
=IFS(
A1>=90, "优秀",
A1>=80, "良好",
A1>=70, "中等",
A1>=60, "及格",
TRUE, "不及格"
)
注意
- 按顺序检查条件
- 最后用TRUE设置默认值
- 简洁明了,易于维护
23.2.3 AND/OR/NOT函数
AND函数
=AND(条件1, 条件2, ...) # 所有条件为TRUE才返回TRUE
# 示例:检查成绩是否在60-100之间
=AND(A1>=60, A1<=100)
OR函数
=OR(条件1, 条件2, ...) # 任一条件为TRUE就返回TRUE
# 示例:检查是否周末
=OR(WEEKDAY(A1,2)=6, WEEKDAY(A1,2)=7)
NOT函数
=NOT(条件) # 反转逻辑值
# 示例:不是周末
=NOT(OR(WEEKDAY(A1,2)=6, WEEKDAY(A1,2)=7))
组合使用
# 判断:销售额>10000 且 (地区="北京" 或 地区="上海")
=IF(AND(B2>10000, OR(C2="北京", C2="上海")), "达标", "未达标")
23.2.4 IFERROR/IFNA函数
IFERROR函数
=IFERROR(公式, 错误时返回值)
# 示例
=IFERROR(A1/B1, 0) # 除零错误返回0
=IFERROR(VLOOKUP(...), "未找到") # 查找错误返回"未找到"
IFNA函数
=IFNA(公式, #N/A时返回值)
# 只处理#N/A错误,其他错误仍显示
=IFNA(VLOOKUP(...), "未找到")
区别
- IFERROR:处理所有错误
- IFNA:只处理#N/A错误
23.3 数组公式
23.3.1 传统数组公式
输入方式 Ctrl + Shift + Enter (CSE数组公式)
示例1:批量计算
# 计算A1:A10乘以B1:B10的和
=SUM(A1:A10*B1:B10) # 按Ctrl+Shift+Enter
# 显示为:{=SUM(A1:A10*B1:B10)}
示例2:多条件计数
# 统计A列="苹果"且B列>10的数量
=SUM((A1:A10="苹果")*(B1:B10>10)) # CSE
示例3:提取唯一值
# 提取A1:A10的唯一值(老版本Excel)
=IFERROR(INDEX($A$1:$A$10,MATCH(0,COUNTIF($B$1:B1,$A$1:$A$10),0)),"")
# CSE输入后向下复制
23.3.2 动态数组(Microsoft 365)
自动溢出
- 无需Ctrl+Shift+Enter
- 结果自动填充到相邻单元格
- 显示蓝色边框
FILTER函数
=FILTER(数组, 包含条件, [找不到时返回值])
# 筛选销售额>10000的记录
=FILTER(A2:C10, B2:B10>10000, "无符合条件数据")
# 多条件筛选
=FILTER(A2:C10, (B2:B10>10000)*(C2:C10="北京"))
SORT函数
=SORT(数组, [排序列号], [升降序], [按行排序])
# 按第2列降序排序
=SORT(A2:C10, 2, -1)
# 多列排序:先按列2降序,再按列3升序
=SORT(A2:C10, {2,3}, {-1,1})
SORTBY函数
=SORTBY(数组, 排序依据数组1, [顺序1], ...)
# 按销售额降序排列产品信息
=SORTBY(A2:C10, B2:B10, -1)
UNIQUE函数
=UNIQUE(数组, [按列], [仅出现一次])
# 提取唯一值
=UNIQUE(A2:A10)
# 提取只出现一次的值
=UNIQUE(A2:A10, , TRUE)
SEQUENCE函数
=SEQUENCE(行数, [列数], [起始值], [步长])
# 生成1-10的序列
=SEQUENCE(10)
# 生成3行4列的序列
=SEQUENCE(3, 4)
# 生成10,20,30...100
=SEQUENCE(10, 1, 10, 10)
RANDARRAY函数
=RANDARRAY([行数], [列数], [最小值], [最大值], [整数])
# 生成5个1-100的随机整数
=RANDARRAY(5, 1, 1, 100, TRUE)
23.3.3 动态数组实战
案例1:动态排名
# 自动生成Top 10列表
=SORT(FILTER(A2:B100, B2:B100<>""), 2, -1)
# 结果自动溢出,无需手动填充
案例2:条件提取
# 提取销售额>10000的所有记录
=FILTER(A2:D100, B2:B100>10000)
# 多条件:北京地区且销售额>10000
=FILTER(A2:D100, (C2:C100="北京")*(B2:B100>10000))
案例3:动态下拉列表
# 数据验证引用动态数组
=UNIQUE(FILTER(A2:A100, A2:A100<>""))
# 自动去重并排除空值
23.4 SUMIFS/COUNTIFS系列
23.4.1 SUMIFS函数
语法
=SUMIFS(求和区域, 条件区域1, 条件1, [条件区域2, 条件2], ...)
基础示例
# 统计北京地区的销售额
=SUMIFS(C2:C100, B2:B100, "北京")
# 多条件:北京地区且产品为"苹果"
=SUMIFS(E2:E100, C2:C100, "北京", D2:D100, "苹果")
通配符应用
# 统计姓名包含"张"的销售额
=SUMIFS(C2:C100, A2:A100, "张*")
# 统计编号以"BJ"开头的销售额
=SUMIFS(C2:C100, B2:B100, "BJ*")
日期条件
# 统计2024年1月的销售额
=SUMIFS(C2:C100, A2:A100, ">=2024-1-1", A2:A100, "<2024-2-1")
# 统计本月销售额
=SUMIFS(C2:C100, A2:A100, ">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1))
大于平均值
=SUMIFS(B2:B100, B2:B100, ">"&AVERAGE(B2:B100))
23.4.2 COUNTIFS函数
语法
=COUNTIFS(条件区域1, 条件1, [条件区域2, 条件2], ...)
示例
# 统计北京地区记录数
=COUNTIFS(B2:B100, "北京")
# 统计销售额>10000且地区="上海"的记录数
=COUNTIFS(C2:C100, ">10000", B2:B100, "上海")
# 统计本月新增客户数
=COUNTIFS(A2:A100, ">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1))
23.4.3 AVERAGEIFS函数
语法
=AVERAGEIFS(平均区域, 条件区域1, 条件1, ...)
示例
# 计算北京地区的平均销售额
=AVERAGEIFS(C2:C100, B2:B100, "北京")
# 计算技术部门的平均工资
=AVERAGEIFS(工资列, 部门列, "技术")
23.4.4 MAXIFS/MINIFS函数
语法
=MAXIFS(最大值区域, 条件区域1, 条件1, ...)
=MINIFS(最小值区域, 条件区域1, 条件1, ...)
示例
# 查找北京地区的最高销售额
=MAXIFS(C2:C100, B2:B100, "北京")
# 查找技术部门的最低工资
=MINIFS(工资列, 部门列, "技术")
23.5 文本处理高级函数
23.5.1 TEXTJOIN函数
语法
=TEXTJOIN(分隔符, 忽略空值, 文本1, [文本2], ...)
示例
# 合并姓名
=TEXTJOIN(" ", TRUE, A2, B2, C2) # "张 三 丰"
# 合并地址
=TEXTJOIN("", TRUE, A2, B2, C2, D2)
# 合并区域(支持数组)
=TEXTJOIN(",", TRUE, A2:A10) # "苹果,香蕉,橙子,..."
条件合并
# 合并销售额>10000的产品名
=TEXTJOIN(",", TRUE, IF(B2:B10>10000, A2:A10, ""))
# 需要CSE输入(非365版本)
# 365版本
=TEXTJOIN(",", TRUE, FILTER(A2:A10, B2:B10>10000))
23.5.2 TEXTSPLIT函数(Microsoft 365)
语法
=TEXTSPLIT(文本, 列分隔符, [行分隔符])
示例
# 拆分文本
=TEXTSPLIT("苹果,香蕉,橙子", ",")
# 结果溢出到3列
# 拆分多行
=TEXTSPLIT("张三,28;李四,30;王五,32", ",", ";")
# 结果:3行2列的数组
23.5.3 CONCAT/CONCATENATE
CONCAT函数
=CONCAT(文本1, [文本2], ...)
# 支持区域引用
=CONCAT(A1:A10) # 直接连接,无分隔符
与TEXTJOIN对比
- CONCAT:无分隔符,不忽略空值
- TEXTJOIN:有分隔符,可忽略空值
23.6 日期时间高级函数
23.6.1 DATEDIF函数
语法
=DATEDIF(开始日期, 结束日期, 单位)
单位说明
- "Y":年数
- "M":月数
- "D":天数
- "YM":年数忽略后的月数
- "MD":月和年数忽略后的天数
- "YD":年数忽略后的天数
示例
# 计算年龄
=DATEDIF(A2, TODAY(), "Y")
# 计算工龄(年+月)
=DATEDIF(A2,TODAY(),"Y")&"年"&DATEDIF(A2,TODAY(),"YM")&"月"
# 计算两个日期相差天数
=DATEDIF(A2, B2, "D")
23.6.2 EDATE/EOMONTH函数
EDATE函数
=EDATE(开始日期, 月数)
# 3个月后的日期
=EDATE(TODAY(), 3)
# 半年前的日期
=EDATE(TODAY(), -6)
EOMONTH函数
=EOMONTH(开始日期, 月数) # 返回该月最后一天
# 本月最后一天
=EOMONTH(TODAY(), 0)
# 下月最后一天
=EOMONTH(TODAY(), 1)
# 本月第一天
=EOMONTH(TODAY(), -1) + 1
23.6.3 NETWORKDAYS函数
语法
=NETWORKDAYS(开始日期, 结束日期, [节假日])
应用
# 计算工作日天数
=NETWORKDAYS(A2, B2)
# 排除节假日
=NETWORKDAYS(A2, B2, 节假日列表)
# 计算N个工作日后的日期
=WORKDAY(TODAY(), 20, 节假日列表)
23.7 实战综合案例
案例1:动态成绩单
需求 根据学号自动显示学生信息和各科成绩
公式
# A2输入学号,自动显示姓名
=XLOOKUP(A2, 学生表[学号], 学生表[姓名], "未找到该学号")
# 显示语文成绩
=XLOOKUP(A2, 成绩表[学号], 成绩表[语文])
# 显示总分
=SUMIFS(成绩表[总分], 成绩表[学号], A2)
# 显示排名
=COUNTIFS(成绩表[总分], ">"&B2) + 1
案例2:销售数据分析
多维度汇总
# 北京地区苹果的销售额
=SUMIFS(销售额, 地区, "北京", 产品, "苹果")
# 本月销售额
=SUMIFS(销售额, 日期, ">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1))
# 销售额前10名的产品列表
=SORT(UNIQUE(FILTER(产品, 销售额>LARGE(销售额,10))), 1, 1)
案例3:考勤异常统计
复杂条件判断
# 判断考勤状态
=IFS(
AND(上班时间>TIME(9,0,0), 上班时间<=TIME(9,30,0)), "迟到",
上班时间>TIME(9,30,0), "严重迟到",
下班时间<TIME(18,0,0), "早退",
TRUE, "正常"
)
# 统计本月迟到次数
=COUNTIFS(姓名列, "张三", 日期列, ">="&本月第一天, 状态列, "*迟到*")
案例4:动态报表
自适应数据更新
# 自动扩展的数据汇总
=SUMIFS(OFFSET(销售额,0,0,COUNTA(销售额),1),
OFFSET(日期列,0,0,COUNTA(日期列),1), ">="&本月第一天)
# 或使用表格(推荐)
=SUMIFS(销售表[销售额], 销售表[日期], ">="&本月第一天)
23.8 函数优化技巧
23.8.1 性能优化
避免易失性函数
# 不推荐(每次重算都变)
=TODAY()
=NOW()
=RAND()
=OFFSET()
# 推荐:计算一次存储为值
减少数组公式
# 不推荐(数组公式)
=SUM(IF(A1:A1000="苹果",B1:B1000,0))
# 推荐(SUMIF)
=SUMIF(A1:A1000,"苹果",B1:B1000)
限定计算范围
# 不推荐(整列)
=SUMIF(A:A,"苹果",B:B)
# 推荐(具体范围)
=SUMIF(A2:A1000,"苹果",B2:B1000)
23.8.2 公式简化
使用辅助列
# 复杂公式拆分为多步
# 第1列:提取年份
=YEAR(A2)
# 第2列:判断条件
=IF(B2=2024,"本年","往年")
# 第3列:汇总
=SUMIF(C:C,"本年",D:D)
使用表格结构化引用
# 传统引用
=SUMIF($A$2:$A$100,"苹果",$B$2:$B$100)
# 表格引用(更清晰)
=SUMIF(销售表[产品],"苹果",销售表[金额])
本章小结
核心函数速查
| 类别 | 函数 | 用途 |
|---|---|---|
| 查找 | VLOOKUP | 纵向查找 |
| 查找 | XLOOKUP | 智能查找(365) |
| 查找 | INDEX+MATCH | 灵活查找组合 |
| 逻辑 | IF/IFS | 条件判断 |
| 逻辑 | AND/OR/NOT | 逻辑组合 |
| 逻辑 | IFERROR/IFNA | 错误处理 |
| 统计 | SUMIFS/COUNTIFS | 多条件汇总 |
| 统计 | AVERAGEIFS | 多条件平均 |
| 数组 | FILTER | 条件筛选(365) |
| 数组 | SORT/SORTBY | 排序(365) |
| 数组 | UNIQUE | 去重(365) |
| 文本 | TEXTJOIN | 智能合并 |
| 日期 | DATEDIF | 日期差计算 |
| 日期 | EDATE/EOMONTH | 日期推算 |
学习建议
- 从基础函数开始,逐步组合
- 理解函数参数和返回值
- 多练习实际案例
- 善用F9键调试公式
- 关注新函数(Microsoft 365)
下一步学习
- 第24章:Excel商业图表制作
- 第25章:Excel财务函数应用
- 第26章:Power Query数据处理
思考练习
- 用VLOOKUP制作产品价格查询表
- 用INDEX+MATCH实现双向查找
- 用SUMIFS统计多维度销售数据
- 用FILTER和SORT制作动态排名表(365版本)
- 综合运用多个函数制作员工信息查询系统
练习提示
- 先拆解问题,确定需要哪些函数
- 分步骤编写公式,逐步测试
- 用IFERROR处理可能的错误
- 添加注释说明公式逻辑