Excel · 第 3 篇
常用函数与公式
透视表能做 80% 的汇总分析,但剩下 20% 需要函数和公式来完成——数据匹配、条件计算、文本处理、日期运算,这些都是函数的主场。
本篇按使用频率排列,覆盖数据分析师日常最高频的 Excel 函数。
第一梯队:查找匹配函数
VLOOKUP — 使用频率最高的函数
VLOOKUP 用于根据关键字从另一张表中查找对应的值,是数据分析师用得最多的函数,没有之一。
语法:
=VLOOKUP(查找值, 查找范围, 返回列号, 匹配模式)
| 参数 | 说明 |
|---|---|
| 查找值 | 你要查的关键字(如用户 ID) |
| 查找范围 | 包含关键字和返回值的表格范围 |
| 返回列号 | 要返回查找范围中第几列的值 |
| 匹配模式 | 0 = 精确匹配(99% 的场景用 0) |
案例:匹配用户城市信息
你有两张表:订单表只有 user_id 和 amount,用户表有 user_id 和 city。需要把城市信息匹配到订单表中。
订单表(Sheet1):
| user_id | amount |
|---|---|
| U1001 | 258 |
| U1002 | 136 |
用户表(Sheet2):
| user_id | city |
|---|---|
| U1001 | 北京 |
| U1002 | 上海 |
在订单表 C2 中写:
=VLOOKUP(A2, Sheet2!$A:$B, 2, 0)
VLOOKUP 的局限:
| 局限 | 说明 |
|---|---|
| 只能向右查 | 查找值必须在查找范围的第一列 |
| 查找范围不能有合并单元格 | 否则结果错误 |
| 大数据量性能差 | 10 万行以上会明显变慢 |
| 插入列后可能出错 | 返回列号是硬编码的数字 |
INDEX + MATCH — VLOOKUP 的升级版
INDEX + MATCH 组合解决了 VLOOKUP 的所有局限,是进阶分析师的首选。
语法:
=INDEX(返回范围, MATCH(查找值, 查找范围, 0))
MATCH(查找值, 查找范围, 0)— 返回查找值在查找范围中的行号INDEX(返回范围, 行号)— 返回指定范围中对应行号的值
案例:同样匹配用户城市,但这次用户表的列顺序是 city 在前、user_id 在后。
用户表(Sheet2):
| city | user_id |
|---|---|
| 北京 | U1001 |
| 上海 | U1002 |
VLOOKUP 做不到(因为查找值不在第一列),但 INDEX-MATCH 可以:
=INDEX(Sheet2!$A:$A, MATCH(A2, Sheet2!$B:$B, 0))
INDEX-MATCH vs VLOOKUP 对比:
| 对比维度 | VLOOKUP | INDEX-MATCH |
|---|---|---|
| 查找方向 | 只能向右 | 任意方向 |
| 插入列的影响 | 会出错 | 不受影响 |
| 性能 | 较慢 | 更快 |
| 可读性 | 更直观 | 略复杂 |
| 推荐程度 | 简单场景可用 | 强烈推荐 |
XLOOKUP — 新一代查找函数(Excel 365/2021+)
如果你使用的是 Excel 365 或 2021 版本,XLOOKUP 是最简洁的选择:
=XLOOKUP(查找值, 查找范围, 返回范围, [找不到时的默认值])
=XLOOKUP(A2, Sheet2!$A:$A, Sheet2!$B:$B, "未找到")
优点:语法简洁、支持任意方向、可设置默认值。
第二梯队:条件判断函数
IF — 基础条件判断
语法:
=IF(条件, 条件为真的返回值, 条件为假的返回值)
案例:判断订单等级
=IF(B2>=1000, "大额订单", "普通订单")
嵌套 IF — 多条件判断
=IF(B2>=5000, "VIP",
IF(B2>=1000, "大额",
IF(B2>=100, "普通", "小额")))
建议:超过 3 层嵌套就用 IFS 函数或者 SWITCH 函数替代,否则可读性极差。
IFS — 多条件判断(Excel 2019+)
=IFS(B2>=5000, "VIP", B2>=1000, "大额", B2>=100, "普通", TRUE, "小额")
IFERROR — 处理错误值
当 VLOOKUP 找不到值时会返回 #N/A 错误。用 IFERROR 包裹可以给出友好的默认值:
=IFERROR(VLOOKUP(A2, Sheet2!$A:$B, 2, 0), "未找到")
第三梯队:条件统计函数
COUNTIF / COUNTIFS — 条件计数
COUNTIF:单条件计数
=COUNTIF(城市列, "北京")
统计城市列中”北京”出现了多少次。
COUNTIFS:多条件计数
=COUNTIFS(城市列, "北京", 品类列, "电子产品")
统计”北京 + 电子产品”的订单数量。
SUMIF / SUMIFS — 条件求和
SUMIF:单条件求和
=SUMIF(城市列, "北京", 销售额列)
SUMIFS:多条件求和
=SUMIFS(销售额列, 城市列, "北京", 品类列, "电子产品")
注意:SUMIFS 的参数顺序和 SUMIF 不同!SUMIFS 的求和范围在前,SUMIF 的求和范围在后。
AVERAGEIF / AVERAGEIFS — 条件平均值
=AVERAGEIFS(销售额列, 城市列, "北京", 渠道列, "线上")
计算北京线上渠道的平均销售额。
实战案例:用条件函数做销售分析
| 分析需求 | 公式 |
|---|---|
| 北京的订单总数 | =COUNTIF(C:C, "北京") |
| 北京的总销售额 | =SUMIF(C:C, "北京", F:F) |
| 北京电子产品的总销售额 | =SUMIFS(F:F, C:C, "北京", D:D, "电子产品") |
| 3月份的平均客单价 | =AVERAGEIF(B:B, ">=2025-03-01", F:F) 需配合日期条件 |
| 销售额>1000的订单占比 | =COUNTIF(F:F, ">1000") / COUNTA(F:F) |
第四梯队:文本处理函数
拼接与拆分
| 函数 | 用途 | 示例 |
|---|---|---|
CONCATENATE 或 & |
文本拼接 | =A2 & "-" & B2 |
TEXTJOIN |
带分隔符拼接 | =TEXTJOIN(",", TRUE, A2:D2) |
LEFT |
取左边 N 个字符 | =LEFT(A2, 4) → “2025” |
RIGHT |
取右边 N 个字符 | =RIGHT(A2, 2) → “01” |
MID |
取中间字符 | =MID(A2, 5, 2) → “03” |
LEN |
计算文本长度 | =LEN(A2) → 10 |
查找与替换
| 函数 | 用途 | 示例 |
|---|---|---|
FIND |
查找文本位置(区分大小写) | =FIND("@", "[email protected]") → 2 |
SEARCH |
查找文本位置(不区分大小写) | =SEARCH("test", "Testing") → 1 |
SUBSTITUTE |
替换文本 | =SUBSTITUTE(A2, "北京市", "北京") |
REPLACE |
按位置替换 | =REPLACE(A2, 1, 3, "XXX") |
格式化
| 函数 | 用途 | 示例 |
|---|---|---|
TRIM |
去除首尾空格 | =TRIM(" 北京 ") → “北京” |
CLEAN |
去除不可打印字符 | =CLEAN(A2) |
UPPER |
转大写 | =UPPER("abc") → “ABC” |
LOWER |
转小写 | =LOWER("ABC") → “abc” |
PROPER |
首字母大写 | =PROPER("hello world") → “Hello World” |
TEXT |
数值转文本格式 | =TEXT(0.85, "0.0%") → “85.0%” |
实战案例:从订单编号中提取信息
订单编号格式:BJ-2025-03-00123(城市缩写-年-月-序号)
| 提取内容 | 公式 |
|---|---|
| 城市缩写 | =LEFT(A2, 2) → “BJ” |
| 年份 | =MID(A2, 4, 4) → “2025” |
| 月份 | =MID(A2, 9, 2) → “03” |
| 序号 | =RIGHT(A2, 5) → “00123” |
第五梯队:日期函数
获取日期部分
| 函数 | 用途 | 示例(假设 A2 = 2025-03-15) |
|---|---|---|
YEAR |
提取年份 | =YEAR(A2) → 2025 |
MONTH |
提取月份 | =MONTH(A2) → 3 |
DAY |
提取日 | =DAY(A2) → 15 |
WEEKDAY |
星期几 | =WEEKDAY(A2, 2) → 6(周六) |
WEEKNUM |
第几周 | =WEEKNUM(A2) → 11 |
日期计算
| 函数 | 用途 | 示例 |
|---|---|---|
TODAY() |
返回今天日期 | =TODAY() → 2025-03-15 |
DATEDIF |
两个日期之间的间隔 | =DATEDIF(A2, B2, "D") → 天数 |
EDATE |
向前/向后推 N 个月 | =EDATE(A2, -1) → 上个月同日 |
EOMONTH |
某月的最后一天 | =EOMONTH(A2, 0) → 2025-03-31 |
NETWORKDAYS |
工作日天数 | =NETWORKDAYS(A2, B2) → 排除周末 |
实战案例:计算用户生命周期
| 需求 | 公式 |
|---|---|
| 用户注册天数 | =TODAY() - 注册日期 |
| 用户注册月数 | =DATEDIF(注册日期, TODAY(), "M") |
| 上月同日 | =EDATE(TODAY(), -1) |
| 本月第一天 | =EOMONTH(TODAY(), -1) + 1 |
| 本月最后一天 | =EOMONTH(TODAY(), 0) |
| 30天内是否有购买 | =IF(最近购买日期 >= TODAY()-30, "活跃", "沉默") |
实战综合案例:构建销售分析看板
场景
你是一家零售公司的数据分析师,需要在 Excel 中构建一个销售分析看板。原始数据是一份订单明细表,包含:订单 ID、日期、门店、品类、销售额、数量。
需要计算的指标
| 指标 | 公式 |
|---|---|
| 本月总销售额 | =SUMIFS(销售额列, 日期列, ">="&本月第一天, 日期列, "<="&本月最后一天) |
| 上月总销售额 | =SUMIFS(销售额列, 日期列, ">="&上月第一天, 日期列, "<="&上月最后一天) |
| 环比增长率 | =(本月销售额 - 上月销售额) / 上月销售额 |
| 本月订单数 | =COUNTIFS(日期列, ">="&本月第一天, 日期列, "<="&本月最后一天) |
| 本月客单价 | =本月销售额 / 本月订单数 |
| 各门店排名 | =RANK(该门店销售额, 所有门店销售额列) |
| TOP 门店名称 | =INDEX(门店列, MATCH(1, RANK列, 0)) |
辅助公式
本月第一天 = EOMONTH(TODAY(), -1) + 1
本月最后一天 = EOMONTH(TODAY(), 0)
上月第一天 = EOMONTH(TODAY(), -2) + 1
上月最后一天 = EOMONTH(TODAY(), -1)
函数使用的最佳实践
1. 用绝对引用锁定范围
在 VLOOKUP 的查找范围中使用 $ 号锁定,否则下拉填充时范围会偏移:
=VLOOKUP(A2, $G$2:$H$100, 2, 0) ← 正确:用 $ 锁定
=VLOOKUP(A2, G2:H100, 2, 0) ← 错误:下拉填充后范围会偏移
2. 用命名范围提高可读性
给常用的范围命名(公式 → 名称管理器):
=VLOOKUP(A2, 用户表, 2, 0) ← 比 Sheet2!$A$2:$H$1000 更易读
3. 用 IFERROR 处理异常
任何查找函数都应该用 IFERROR 包裹:
=IFERROR(VLOOKUP(A2, 用户表, 2, 0), "未匹配")
4. 避免整列引用
=VLOOKUP(A2, A:B, 2, 0) 会扫描整列 100 万行,非常慢。尽量指定精确范围。
5. 用辅助列简化复杂公式
如果一个公式嵌套了 5 层以上,把中间步骤拆到辅助列,方便调试和维护。
练习题
-
你有一份订单表和一份产品表。订单表有”产品ID”和”数量”,产品表有”产品ID”、”产品名称”、”单价”。请用 VLOOKUP 和 INDEX-MATCH 两种方式,在订单表中匹配产品名称和单价,并计算每笔订单的总金额。
-
给定一份包含”日期”和”销售额”的数据,请计算:本月累计销售额、上月同期累计销售额、同比增长率。
-
一份用户数据包含”注册日期”和”最近登录日期”。请用函数将用户分为”活跃用户”(30天内登录)、”沉默用户”(30-90天未登录)、”流失用户”(90天以上未登录)三类。
小结
| 函数类别 | 核心函数 | 使用场景 |
|---|---|---|
| 查找匹配 | VLOOKUP、INDEX-MATCH、XLOOKUP | 跨表匹配数据 |
| 条件判断 | IF、IFS、IFERROR | 分类、异常处理 |
| 条件统计 | COUNTIFS、SUMIFS、AVERAGEIFS | 多条件汇总计算 |
| 文本处理 | LEFT、MID、SUBSTITUTE、TRIM | 数据清洗、信息提取 |
| 日期计算 | YEAR、MONTH、DATEDIF、EOMONTH | 时间维度分析 |
下一篇我们将学习 图表制作与美化——用专业的可视化呈现你的分析结果。