乐于分享
好东西不私藏

Excel 查找与引用函数:INDEX + MATCH、OFFSET、INDIRECT

Excel 查找与引用函数:INDEX + MATCH、OFFSET、INDIRECT

在前面的教程中,我们已经学习了 VLOOKUP、XLOOKUP 等基础查找函数。但面对更复杂的查找需求(如向左查找、动态区域引用、多条件交叉查询),这些函数有时会显得力不从心。而 INDEX + MATCH 组合、OFFSET 和 INDIRECT 则是应对这些高级场景的利器。

本文将深入讲解这三个函数的核心用法,并通过实战案例帮助你掌握它们。


一、INDEX – 按位置返回值

功能

根据指定的行号和列号,返回区域中某个单元格的值。

语法

=INDEX(区域, 行号, [列号])
  • 如果区域是一行或一列,可以省略其中一个参数。

示例

公式
结果
说明
=INDEX(A1:C3, 2, 3)
A1:C3 区域中第2行第3列的值
相当于 R2C3
=INDEX(A:A, 5)
A列第5行的值
单列时只需行号
=INDEX(1:1, 4)
第1行第4列的值
单行时只需列号

实战案例:根据行号动态返回数据

A列为姓名,B列为成绩。已知行号在 D1 单元格:

=INDEX(B:B, D1)

二、MATCH – 查找位置

功能

返回指定值在区域中的相对位置(第几个)。

语法

=MATCH(查找值, 查找区域, [匹配类型])
  • 匹配类型:0 = 精确匹配(最常用);1 = 升序近似匹配;-1 = 降序近似匹配。

示例

公式
结果
说明
=MATCH("张三", A:A, 0)
张三在A列的第几行
精确匹配
=MATCH(85, B:B, 0)
分数85在B列的行号
若重复,返回第一个

三、INDEX + MATCH 组合(黄金搭档)

为什么需要组合?

  • VLOOKUP 只能向右查找,且查找列必须在第一列。

  • INDEX + MATCH 可以实现任意方向的查找,且不依赖列顺序。

语法结构

=INDEX(返回区域, MATCH(查找值, 查找区域, 0))

实战案例1:向左查找(VLOOKUP 做不到的)

场景:根据员工姓名查找员工ID(姓名在B列,ID在A列)。

A(ID)
B(姓名)
C(部门)
1001
张三
销售部
1002
李四
技术部

=INDEX(A:A, MATCH(“张三”, B:B, 0))

结果:1001

实战案例2:多条件查找(二维交叉查询)

场景:根据“产品”和“季度”查找对应的销量。

产品
Q1
Q2
Q3
手机
100
150
120
电脑
80
90
110

查找“电脑”的“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)
从A1向下2行、向右3列的单元格(即 D3)
=OFFSET(A1, 0, 0, 5, 1)
以A1为起点,高度5行、宽度1列的区域(A1:A5)
=SUM(OFFSET(A1, 1, 0, 3, 1))
对A2:A4求和

实战案例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")
返回 A1 单元格的值
=INDIRECT("Sheet2!B2")
返回 Sheet2 的 B2 值
=INDIRECT("B" & C1)
如果 C1=5,则返回 B5 的值

实战案例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列为业绩。数据按员工分组且月份升序。

解决方案

  1. 用 MATCH 找到该员工首次出现的行号。

  2. 用 COUNTIF 统计该员工出现的次数(作为高度)。

  3. 用 OFFSET 动态引用该员工的所有业绩区域。

  4. 再用 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
只返回位置,不返回值
INDEX+MATCH
任意方向查找、多条件查找
比VLOOKUP强大,不受列顺序限制
需要两个函数嵌套
OFFSET
动态区域、动态图表
可根据偏移构建区域
易失性函数,大量使用影响性能
INDIRECT
文本地址引用、跨工作表动态引用
实现“变量”式引用
易失性,且引用不随工作表重命名自动更新

八、常见错误及解决方法

错误/问题
原因
解决方法
#N/A
MATCH 找不到值
检查查找值是否存在,或使用 IFERROR 处理
#REF!
INDEX 的行号或列号超出区域范围
检查 MATCH 返回的位置是否在区域内
#VALUE!
OFFSET 的高度或宽度为负数
高度和宽度必须为正数
引用结果不正确
忘了使用绝对引用($),下拉时区域偏移
在公式中添加 $ 锁定区域
INDIRECT 返回 #REF!
引用的工作表名称不存在或拼写错误
核对工作表名称和引号格式
公式运算慢
大量使用 OFFSET/INDIRECT 易失性函数
改用 INDEX 或辅助列

九、总结

需求
推荐方案
根据某列值查找另一列对应值
INDEX + MATCH

(替代 VLOOKUP)
二维交叉查询(行+列条件)
INDEX + MATCH(两次)
动态区域(如最近N行)
OFFSET
动态下拉菜单数据源
OFFSET + COUNTA
根据工作表名称动态引用
INDIRECT
创建动态图表
OFFSET 定义名称

学习建议

  • 优先掌握 INDEX + MATCH 组合,它能解决 90% 的复杂查找需求。

  • OFFSET 适合需要动态范围计算的场景,但注意性能。

  • INDIRECT 在跨工作表汇总时非常方便,但要小心重命名工作表带来的问题。