乐于分享
好东西不私藏

Excel动态引用还在手动输单元格?ADDRESS+INDIRECT才是隐藏神组合

Excel动态引用还在手动输单元格?ADDRESS+INDIRECT才是隐藏神组合
标签:
#Excel教程 #函数公式 #办公技巧 #数据处理 #动态引用
最近处理表格时,很多人还在用最原始的方式引用单元格:
- 手动输入  A1 、 B5 、 D10 
- 用  IF()+ROW()  做自动编号
- 遇到行列变化,公式就错位、报错、返工
今天我们讲一组更灵活的组合:ADDRESS() + INDIRECT()。
它的核心逻辑很简单:
用“行号 + 列号”生成单元格地址,再把地址变成真实引用。
也就是说,以后你不用死记  A1 、 C3 、 F8 ,只要告诉 Excel:
“我要第几行、第几列的数据”,它就能自动帮你取到。
先痛点:为什么手动引用很容易翻车?
我们平时写公式,最常见的就是这种:
=A1
=B2
=D10
这种写法简单,但有个大问题:位置写死了。
一旦表格里插入行、删除行、调整列顺序,公式很容易变成:
- 引用位置跑偏
- 数据对应不上
- 明明公式没红,结果已经错了
- 排查起来特别费时间
于是有人会用  ROW()  自动生成行号:
=ROW()
或者结合  IF()  做一些判断:
=IF(ROW()>10,"超出范围",ROW())
但这种方法仍然有局限:
- 行可以自动生成
- 列仍然不够灵活
- 复杂查询容易嵌套一大串
- 公式越长,越难维护
所以,如果想真正实现“第几行、第几列都能自由控制”,就可以用:
=INDIRECT(ADDRESS(行号,列号))
ADDRESS():把行号列号变成单元格地址
先看  ADDRESS() 。
它的作用是:
输入“第几行、第几列”,返回一个单元格地址文本。
语法:
=ADDRESS(行号,列号)
例如:
=ADDRESS(2,1)
意思是:
- 第 2 行
- 第 1 列
所以它会返回:$A$2
再比如:=ADDRESS(5,3)
表示第 5 行、第 3 列,返回:
$C$5
也就是说, ADDRESS()  负责帮你把数字变成地址。
但这里要注意:
 ADDRESS()  只是生成地址文本,并不会真正读取单元格里的数据。
比如  $A$2  只是一串地址文字,Excel 还不一定知道你是要引用它。
所以,我们需要第二个函数: INDIRECT() 。
INDIRECT():把地址文本变成真实引用
 INDIRECT()  的作用是:
把一段“地址文字”,转换成真正的单元格引用。
例如:
=INDIRECT("A1")
它会读取  A1  单元格里的内容。
再比如:
=INDIRECT("D10")
它会读取  D10  单元格的数据。
这意味着,只要你能生成一个合法的单元格地址, INDIRECT()  就能帮你去读数据。
所以, ADDRESS()  和  INDIRECT()  天生适合组队。
王炸组合:INDIRECT + ADDRESS
把两个函数合在一起,就是:
=INDIRECT(ADDRESS(行号,列号))
它的逻辑是:
1.  ADDRESS(行号,列号)  生成地址
2.  INDIRECT()  把地址变成真实引用
3. 最终返回对应单元格的数据
举个例子:
=INDIRECT(ADDRESS(3,4))
这里:
- 第 3 行
- 第 4 列
第 4 列是  D ,所以等价于:
=D3
但它比直接写  =D3  灵活得多。
因为你可以把行号和列号放在其他单元格里,比如:
- A1 放行号
- B1 放列号
然后公式写成:
=INDIRECT(ADDRESS(A1,B1))
这时,只要改 A1 和 B1 里的数字,公式就会自动切换到不同单元格。
比如:
A1 行号 B1 列号 公式结果 
2 1 A2 
5 3 C5 
10 4 D10 
7 6 F7 
这就是真正的动态引用。
三种引用方式对比,差距很明显
1. 手动输入单元格地址
公式:
=D3
优点:
- 简单直接
- 新手容易理解
缺点:
- 位置固定
- 增删行列容易出错
- 不适合复杂表格
- 维护成本高
适合:
简单表格、固定位置数据。
2. IF() + ROW()
公式:
=IF(ROW()>10,"超出范围",ROW())
优点:
- 可以自动生成行号
- 适合序号、判断类场景
缺点:
- 列控制弱
- 嵌套复杂
- 可读性差
- 不适合灵活取数
适合:
需要判断行号、生成简单序列的场景。
3. ADDRESS() + INDIRECT()
公式:
=INDIRECT(ADDRESS(行号,列号)
优点:
- 行号、列号都可以控制
- 公式短
- 逻辑清晰
- 适合动态取数
- 适合交叉查询
缺点:
- 初学者第一次看到会觉得绕
- 大数据量表格要注意性能
适合:
动态报表、交叉查询、灵活取数、需要频繁切换引用位置的表格。
这个组合适合哪些场景?
1. 动态交叉查询
如果你经常要根据“行条件 + 列条件”找数据,这个组合很有用。
比如表格里有:
- 姓名在某一行
- 月份在某一列
- 要根据行号和列号取对应销售额
就可以用:
=INDIRECT(ADDRESS(行号,列号))
它比单纯手动写死单元格更灵活。
2. 动态报表取数
做周报、月报、汇总表时,经常会遇到一个问题:
数据源结构变了,公式也要跟着改。
使用  ADDRESS()+INDIRECT() ,你可以把取数逻辑改成:
- 第几行
- 第几列
只要行号列号能确定,就能继续取数。
3. 隔行、隔列提取数据
有些数据不是连续排列的,比如:
- 每 3 行取一次
- 每 2 列取一次
- 只取奇数行
- 只取指定列
这种场景下,手动写公式会很麻烦。
而  ADDRESS()  可以配合其他函数生成规律行号、列号,再用  INDIRECT()  读取数据。
新手使用时要注意这 3 点
1. 行号列号不能是 0 或负数
 ADDRESS()  里的行号和列号必须是有效正整数。
例如“=ADDRESS(1,1)”是合法的。
但:
=ADDRESS(0,1)
=ADDRESS(-1,1)
容易报错。
2. INDIRECT 属于易变函数
 INDIRECT()  会随着表格结构变化重新计算。
在小表格里它非常好用,但如果是超大数据表,要注意:
- 少用在整列批量公式里
- 避免大量嵌套
- 能用更稳定方案时,也要考虑性能
3. 它不是万能替代 VLOOKUP
 ADDRESS()+INDIRECT()  适合做动态引用,但它并不等同于  VLOOKUP() 、 XLOOKUP() 、 INDEX()+MATCH() 。
它们的区别大概是:
函数组合 适合场景 
VLOOKUP 按查找值纵向匹配 
XLOOKUP 更灵活的查找匹配 
INDEX()+MATCH 专业双向查找 
ADDRESS()+INDIRECT 按行号列号动态引用 
所以不要说它能替代所有查找函数。
它真正强的地方是:用数字控制位置,实现更灵活的引用。
今天这组公式可以记成一句话:
ADDRESS 负责生成地址,INDIRECT 负责读取数据。
核心公式:
=INDIRECT(ADDRESS(行号,列号))
它比手动输入  A1 、 B2  更灵活,也比单纯  IF()+ROW()  更适合处理行列都需要动态变化的表格。
以后再遇到需要“根据第几行、第几列取数据”的场景,不妨试试这组组合。
一句话记住:
单元格不一定要手写,行号列号也能控制数据引用。