高级公式
问题
数据分析中常用的 Excel 高级公式有哪些?如何选择合适的查找函数?
答案
查找函数对比
| 函数 | 优势 | 局限 | 推荐度 |
|---|---|---|---|
| VLOOKUP | 简单直观 | 只能向右查找、整列匹配 | ⭐⭐⭐ |
| INDEX-MATCH | 灵活、可左向查找 | 公式稍长 | ⭐⭐⭐⭐ |
| XLOOKUP | 最强大、默认精确匹配 | Office 365+ | ⭐⭐⭐⭐⭐ |
VLOOKUP
=VLOOKUP(查找值, 表格区域, 列号, 匹配类型)
| 参数 | 说明 |
|---|---|
| 查找值 | 要匹配的值 |
| 表格区域 | 查找范围(查找值必须在第一列) |
| 列号 | 返回第几列的值 |
| 匹配类型 | FALSE=精确匹配,TRUE=近似匹配 |
=VLOOKUP(A2, 产品表!$A:$D, 3, FALSE)
VLOOKUP 常见陷阱
- 查找值必须在区域的第一列——无法向左查找
- 列号是硬编码数字,插入/删除列后容易出错
- 近似匹配(TRUE)要求数据已排序
- 大数据量下性能较差
INDEX-MATCH 组合
=INDEX(返回区域, MATCH(查找值, 查找区域, 匹配类型))
=INDEX(C:C, MATCH(A2, B:B, 0))
优势:
- 可以向左查找
- 返回区域和查找区域可以分开
- 插入列不影响结果
- 性能优于 VLOOKUP
XLOOKUP(推荐)
=XLOOKUP(查找值, 查找区域, 返回区域, [未找到], [匹配模式], [搜索模式])
=XLOOKUP(A2, 产品表!A:A, 产品表!C:C, "未找到")
| 匹配模式 | 值 | 说明 |
|---|---|---|
| 精确匹配 | 0 | 默认 |
| 通配符 | 2 | 支持 * ? |
| 下一个较小值 | -1 | 近似匹配 |
| 下一个较大值 | 1 | 近似匹配 |
XLOOKUP 高级用法
// 返回多列
=XLOOKUP(A2, 产品表!A:A, 产品表!B:D)
// 反向搜索(从后往前)
=XLOOKUP(A2, 区域, 返回区域, , 0, -1)
条件统计函数
| 函数 | 用途 | 示例 |
|---|---|---|
COUNTIF | 单条件计数 | =COUNTIF(A:A, "北京") |
COUNTIFS | 多条件计数 | =COUNTIFS(A:A, "北京", B:B, ">100") |
SUMIF | 单条件求和 | =SUMIF(A:A, "北京", C:C) |
SUMIFS | 多条件求和 | =SUMIFS(C:C, A:A, "北京", B:B, ">100") |
AVERAGEIF | 条件平均 | =AVERAGEIF(A:A, "北京", C:C) |
MAXIFS | 条件最大值 | =MAXIFS(C:C, A:A, "北京") |
SUMIF vs SUMIFS 参数顺序不同
SUMIF(条件区域, 条件, 求和区域)— 求和区域在最后SUMIFS(求和区域, 条件区域1, 条件1, ...)— 求和区域在最前
文本函数
| 函数 | 用途 | 示例 |
|---|---|---|
LEFT/RIGHT/MID | 提取子串 | =LEFT(A2, 4) → 前4字符 |
TRIM | 去多余空格 | =TRIM(A2) |
SUBSTITUTE | 替换文本 | =SUBSTITUTE(A2, "-", "") |
TEXT | 格式化 | =TEXT(A2, "YYYY-MM") |
TEXTJOIN | 拼接 | =TEXTJOIN(",", TRUE, A2:A10) |
CONCAT | 合并 | =CONCAT(A2, "-", B2) |
日期函数
| 函数 | 用途 | 示例 |
|---|---|---|
YEAR/MONTH/DAY | 提取日期部分 | =YEAR(A2) |
EOMONTH | 月末日期 | =EOMONTH(A2, 0) → 本月末 |
DATEDIF | 日期差 | =DATEDIF(A2, B2, "M") → 月差 |
WEEKDAY | 星期几 | =WEEKDAY(A2, 2) → 1=周一 |
WORKDAY | 工作日 | =WORKDAY(A2, 10) → 10个工作日后 |
数组公式与溢出
Excel 365 支持动态数组,公式自动溢出到相邻单元格:
| 函数 | 用途 | 示例 |
|---|---|---|
UNIQUE | 去重 | =UNIQUE(A2:A100) |
SORT | 排序 | =SORT(A2:B100, 2, -1) |
FILTER | 条件筛选 | =FILTER(A:C, B:B>100) |
SEQUENCE | 生成序列 | =SEQUENCE(10, 1, 1) |
SORTBY | 按指定列排序 | =SORTBY(A:C, C:C, -1) |
RANDARRAY | 随机数组 | =RANDARRAY(5, 3) |
动态数组组合技
// 去重 + 排序
=SORT(UNIQUE(A2:A100))
// 筛选 + 排序
=SORT(FILTER(A:C, B:B="北京"), 3, -1)
LET 函数
Excel 365 中避免重复计算的利器:
=LET(
data, FILTER(A:C, B:B>"2024-01-01"),
total, SUM(INDEX(data, , 3)),
avg, AVERAGE(INDEX(data, , 3)),
"合计: " & total & " 均值: " & avg
)
LAMBDA 自定义函数
// 名称管理器中定义 LAMBDA
名称: Tax
引用: =LAMBDA(amount, rate, amount * rate)
// 使用
=Tax(A2, 0.13)
常见面试问题
Q1: VLOOKUP 找不到值怎么排查?
答案(排查清单):
- 数据类型不一致:查找值是数字、查找区域是文本(或反之)
- 多余空格:用
TRIM清理 - 不可见字符:用
CLEAN清理 - 匹配类型错误:第 4 个参数应为
FALSE(精确匹配) - 查找值不在第一列:改用 INDEX-MATCH
Q2: 如何提取每个地区的 Top3 销量产品?
答案:
=SORT(FILTER(产品列, 地区列=目标地区), 销量列, -1)
取前 3 行:
=INDEX(SORT(FILTER(A:C, B:B="北京"), 3, -1), SEQUENCE(3), {1,2,3})
Q3: VLOOKUP 和 INDEX-MATCH 在性能上有什么差异?
答案:
- VLOOKUP:每次查找扫描整个表格区域,列数越多越慢
- INDEX-MATCH:只扫描两列(查找列和返回列),性能更好
- 在 10 万行以上数据时差异明显
- XLOOKUP 性能与 INDEX-MATCH 接近,且使用更简单