Excel 查找与引用函数:INDEX + MATCH、OFFSET、INDIRECT
在前面的教程中,我们已经学习了 VLOOKUP、XLOOKUP 等基础查找函数。但面对更复杂的查找需求(如向左查找、动态区域引用、多条件交叉查询),这些函数有时会显得力不从心。而 INDEX + MATCH 组合、OFFSET 和 INDIRECT 则是应对这些高级场景的利器。
本文将深入讲解这三个函数的核心用法,并通过实战案例帮助你掌握它们。
一、INDEX – 按位置返回值
功能
根据指定的行号和列号,返回区域中某个单元格的值。
语法
=INDEX(区域, 行号, [列号])
-
如果区域是一行或一列,可以省略其中一个参数。
示例
|
|
|
|
|---|---|---|
=INDEX(A1:C3, 2, 3) |
|
|
=INDEX(A:A, 5) |
|
|
=INDEX(1:1, 4) |
|
|
实战案例:根据行号动态返回数据
A列为姓名,B列为成绩。已知行号在 D1 单元格:
=INDEX(B:B, D1)
二、MATCH – 查找位置
功能
返回指定值在区域中的相对位置(第几个)。
语法
=MATCH(查找值, 查找区域, [匹配类型])
-
匹配类型:0 = 精确匹配(最常用);1 = 升序近似匹配;-1 = 降序近似匹配。
示例
|
|
|
|
|---|---|---|
=MATCH("张三", A:A, 0) |
|
|
=MATCH(85, B:B, 0) |
|
|
三、INDEX + MATCH 组合(黄金搭档)
为什么需要组合?
-
VLOOKUP 只能向右查找,且查找列必须在第一列。
-
INDEX + MATCH 可以实现任意方向的查找,且不依赖列顺序。
语法结构
=INDEX(返回区域, MATCH(查找值, 查找区域, 0))
实战案例1:向左查找(VLOOKUP 做不到的)
场景:根据员工姓名查找员工ID(姓名在B列,ID在A列)。
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
=INDEX(A:A, MATCH(“张三”, B:B, 0))
结果:1001
实战案例2:多条件查找(二维交叉查询)
场景:根据“产品”和“季度”查找对应的销量。
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
查找“电脑”的“Q3”销量:
=INDEX(B2:D3, MATCH(“电脑”, A2:A3, 0), MATCH(“Q3”, B1:D1, 0))
实战案例3:动态双向查找(与数据验证联动)
将产品名称放在下拉列表(数据验证)的 E1 单元格,季度放在 F1,公式自动更新:
=INDEX(B2:D3, MATCH(E1, A2:A3, 0), MATCH(F1, B1:D1, 0))
四、OFFSET – 动态区域引用
功能
以某个单元格为基准,通过偏移行数、列数,返回一个单元格或区域引用。
语法
=OFFSET(参照单元格, 偏移行数, 偏移列数, [高度], [宽度])
-
偏移行数:正数向下,负数向上。
-
偏移列数:正数向右,负数向左。
-
高度/宽度:可选,指定返回区域的行数和列数。
基础示例
|
|
|
|---|---|
=OFFSET(A1, 2, 3) |
|
=OFFSET(A1, 0, 0, 5, 1) |
|
=SUM(OFFSET(A1, 1, 0, 3, 1)) |
|
实战案例1:制作动态下拉菜单(数据验证来源)
数据源为 A 列,但行数不固定。定义名称“动态数据”:
=OFFSET(Sheet1!$A$1, 0, 0, COUNTA(Sheet1!$A:$A), 1)
然后在数据验证的“来源”中输入 =动态数据,菜单会自动包含所有非空项。
实战案例2:动态计算最近 N 天销售额
A列为日期(升序),B列为销售额。在 E1 输入要统计的天数(如 7),公式:
=SUM(OFFSET(B1, COUNTA(B:B)-E1, 0, E1, 1))
此公式会动态计算最后 N 天的总和。
实战案例3:创建动态图表系列
使用 OFFSET 定义名称作为图表的数据源,数据增加时图表自动扩展。
五、INDIRECT – 文本引用
功能
将文本字符串转换为有效的单元格引用。
语法
=INDIRECT(引用文本, [引用样式])
-
引用文本:表示单元格地址的字符串,如
"A1"或"Sheet2!B2"。 -
引用样式:默认 A1 样式;若用 R1C1 样式需指定。
基础示例
|
|
|
|---|---|
=INDIRECT("A1") |
|
=INDIRECT("Sheet2!B2") |
|
=INDIRECT("B" & C1) |
|
实战案例1:根据工作表名称动态引用
假设有工作表“1月”、“2月”、“3月”,每个表结构相同。在汇总表中,A列为月份名称(文本),B列需引用对应工作表的总销售额(假设都在 B10 单元格):
=INDIRECT("'" & A2 & "'!B10")
这样修改 A2 的值,公式会自动切换到不同工作表。
实战案例2:构建可变的单元格地址
需要根据行号(C1)和列号(D1)动态获取值:
=INDIRECT(ADDRESS(C1, D1))
ADDRESS 函数可将行列号转为地址字符串,再交给 INDIRECT。
注意事项
-
INDIRECT 是易失性函数,当工作簿中任何单元格发生变化时都会重新计算,大量使用可能影响性能。
-
如果引用的工作表名称包含空格或特殊字符,必须用单引号括起来,如
"'" & A2 & "'!B10"。
六、综合实战案例
案例1:INDEX + MATCH + OFFSET 实现动态区域汇总
需求:统计指定员工在最近 N 个月的业绩总和。
数据结构:A列为员工姓名,B列为月份(1-12),C列为业绩。数据按员工分组且月份升序。
解决方案:
-
用 MATCH 找到该员工首次出现的行号。
-
用 COUNTIF 统计该员工出现的次数(作为高度)。
-
用 OFFSET 动态引用该员工的所有业绩区域。
-
再用 OFFSET 取最后 N 个月。
=SUM(OFFSET(OFFSET(C1, MATCH(E1, A:A, 0)-1, 0, COUNTIF(A:A, E1), 1), COUNTIF(A:A, E1)-F1, 0, F1, 1))
(E1 为员工姓名,F1 为月数)
案例2:制作可切换的报表(INDIRECT + 下拉菜单)
-
创建三个工作表:数据2024、数据2025、数据2026。
-
在每个工作表的相同位置(如 B2)存放总销售额。
-
在汇总表,用数据验证制作下拉菜单(年份)。
-
公式:
=INDIRECT("'数据" & A2 & "'!B2")
选择年份,自动显示对应年度的总销售额。
案例3:INDEX + MATCH 替代 VLOOKUP 处理插入列
VLOOKUP 中如果插入列,返回列序号会错。但 INDEX+MATCH 直接引用列,不会受影响。例如:
=INDEX(B:B, MATCH("张三", A:A, 0))
即使 B 列左边插入了新列,公式仍然返回姓名,因为直接引用了 B 列。
七、函数对比总结
|
|
|
|
|
|---|---|---|---|
| INDEX |
|
|
|
| MATCH |
|
|
|
| INDEX+MATCH |
|
|
|
| OFFSET |
|
|
|
| INDIRECT |
|
|
|
八、常见错误及解决方法
|
|
|
|
|---|---|---|
#N/A |
|
|
#REF! |
|
|
#VALUE! |
|
|
|
|
$),下拉时区域偏移 |
$ 锁定区域 |
|
|
|
|
|
|
|
|
九、总结
|
|
|
|---|---|
|
|
INDEX + MATCH
|
|
|
INDEX + MATCH(两次) |
|
|
OFFSET |
|
|
OFFSET + COUNTA |
|
|
INDIRECT |
|
|
OFFSET 定义名称 |
学习建议:
-
优先掌握 INDEX + MATCH 组合,它能解决 90% 的复杂查找需求。
-
OFFSET 适合需要动态范围计算的场景,但注意性能。
-
INDIRECT 在跨工作表汇总时非常方便,但要小心重命名工作表带来的问题。
夜雨聆风