📌 阶段四 · 进阶函数 · 第19讲 INDIRECT函数 · 约 45 分钟

用 INDIRECT 函数把 12 个月销售分表汇成一张全年汇总表

学习目标

  • 说出直接引用与间接引用的区别,写出 INDIRECT 函数的语法
  • 会用文本拼接生成单元格地址,让公式随月份自动换表
  • 掌握 INDIRECT 与 VLOOKUP 结合的跨表查找写法
  • 会给区域定义名称,并用 INDIRECT 汇总名称区域
  • 完成进销存系统的月度汇总模块:选择月份自动抓取对应分表数据

知识点讲解

从 =A1 说起:什么是间接引用

在 A1 单元格输入「小佩」,在别的单元格写 =A1,会返回「小佩」——这是我们一直在用的直接引用。

间接引用多绕了一道弯:先在 C10 里输入文字 A1,再写 =INDIRECT(C10),结果同样是「小佩」。因为 INDIRECT 会先把 C10 的内容「A1」当作单元格地址,再去把 A1 里的东西取出来。

但如果你写成 =INDIRECT("C10"),给 C10 套上双引号,它就只是一个文本了:公式返回的是 C10 单元格里的文字本身(也就是「A1」这两个字),而不是 A1 里的「小佩」。

函数语法:=INDIRECT(ref_text,[a1]),即 =INDIRECT(引用的单元格,引用方式)。第二个参数指引用样式:A1 样式(列用字母、行用数字,我们平时用的就是它)或 R1C1 样式(行列全用数字)。默认 A1 样式,第二个参数几乎总是省略,只需关心第一个参数。

=A1

直接引用:返回 A1 单元格的内容

=INDIRECT(C10)

间接引用:C10 的内容是「A1」,函数把它当作地址,返回 A1 单元格的内容

=INDIRECT("C10")

参数加了双引号变成文本,返回 C10 单元格里的文字本身,不再跳到 A1 去取值

💡 提示:

  • ref_text 如果不是合法的单元格引用,INDIRECT 会返回错误值 #REF! 或 #NAME?
  • 看到 #NAME? 先检查拼接出来的表名、地址有没有写错字

用文本拼出地址:INDIRECT 的正确打开方式

INDIRECT 最常用的套路是「先拼地址、再转引用」。比如要每隔 5 行取一个数(第 5、10、15、20、25 行的数据),用第 17 讲的 INDEX 可以写 =INDEX(E:E,ROW()*5-25);换 INDIRECT 的思路则是:先用 & 拼出地址文本 ="e"&ROW()*5-25,下拉时依次得到 e5、e10、e15……再套上 INDIRECT 把文本变成真引用:=INDIRECT("e"&ROW()*5-25)。

为什么要这么绕?因为直接引用的行号没法用公式动态生成,而拼出来的文本可以随意组装——这正是后面跨表汇总的基础。

=INDEX(E:E,ROW()*5-25)

INDEX 版:用 ROW() 算出要取的行号,第 1 行公式取 E5,下拉依次取 E10、E15……

="e"&ROW()*5-25

先用文本拼接算出地址字符串,下拉依次得到 e5、e10、e15……

=INDIRECT("e"&ROW()*5-25)

把拼好的地址文本转成真正的引用,返回对应单元格的值

跨表动态引用:12 张表汇总靠它

现在把拼地址的思路放到工作表名字上。假设 12 位销售人员的业绩分别记在 12 张表里,要汇总张三每个月的业绩:

情况一:每张表排版一致,张三都固定在 G2。那么在汇总表 A 列写表名(1月、2月……),B4 写 =INDIRECT(A4&"!G2")——A4 是「1月」就去 1月!G2 取数,A4 改成「2月」公式自动换表,下拉一整年全出来。

情况二:每张表排版不一致,张三的位置不固定。把 INDIRECT 塞进 VLOOKUP 的第二参数:=VLOOKUP("张三",INDIRECT(A4&"!A:G"),7,0),先由 INDIRECT 决定去哪张表找,再由 VLOOKUP 在表里定位。

情况三:要同时查多个人在多个月份的业绩,公式要横向、纵向都能拖。用混合引用锁住该锁的部分:=VLOOKUP(B$2,INDIRECT($A3&"!$A:$G"),7,0)——第一行放人名、第一列放月份,往右往下拖都能对。

=INDIRECT(A4&"!G2")

A4 存表名(如 1月),拼出「1月!G2」这样的跨表地址;表名变化时公式自动换表取数

=VLOOKUP("张三",INDIRECT(A4&"!A:G"),7,0)

INDIRECT 负责动态指定查找区域(哪张表的 A 到 G 列),VLOOKUP 在区域内找张三并返回第 7 列业绩,0 表示精确匹配

=VLOOKUP(B$2,INDIRECT($A3&"!$A:$G"),7,0)

混合引用版:B$2 锁行不锁列(横向拖时人名跟着列走),$A3 锁列不锁行(纵向拖时月份跟着行走)

💡 提示:

  • 表名和感叹号「!」必须用半角字符,拼出来的地址才合法
  • VLOOKUP 的第三参数是目标所在列数,第四参数 0 表示精确匹配(第 11 讲详细讲过)

报错先查表名:单引号兜底写法

如果公式本身没问题、INDIRECT 却报错,多半是表名惹的祸:表名里带空格、点号等特殊字符时,普通写法可能拼不出合法地址。稳妥的做法是给表名两侧套上英文单引号,写成 =INDIRECT("'"&A4&"'!G2")。这样无论表名长什么样,都能正确引用。

="'"&A4&"'!G2"

假设 A4 是 1月,拼出的地址是 '1月'!G2——表名被单引号包住了

=INDIRECT("'"&A4&"'!G2")

外层套 INDIRECT,把带单引号的地址转成真实引用

💡 提示:

  • 这里的单引号是英文半角撇号 ',夹在一对双引号中间写

给区域起名字,再用 INDIRECT 调用

INDIRECT 还能引用「名称」。先选中有数据的单元格区域,点公式选项卡-名称管理器,给 B2:B13 定义名称「张三」。之后求和既可以写 =SUM(B2:B13),也可以写 =SUM(张三)。

真正好用的玩法是配合 INDIRECT:在 G 列放一列人名,求和公式写 =SUM(INDIRECT(G3))——G3 写「张三」就汇总张三的区域,下拉到李四、王五,谁的金额都自动算出来。公式只有一条,谁的名单换了都不用改。

=SUM(B2:B13)

普通写法:直接对区域求和

=SUM(张三)

名称写法:B2:B13 已被命名为「张三」,求和结果完全一样

=SUM(INDIRECT(G3))

G3 单元格里写的是人名,INDIRECT 把它变成对应的名称区域,下拉即可汇总每个人的金额

顺手学一个:二级下拉列表

名称和 INDIRECT 组合还能做「二级下拉」:先选大类,再选小类时只出现该大类下的选项。三步搞定:

第一步批量建名称:选中包含类别和明细的单元格区域,点公式选项卡-根据所选内容创建,勾选「首行」,Excel 会按第一行的文字批量建好几个名称(比一个个新建省事得多)。

第二步做一级下拉:选中目标列,数据选项卡-数据验证(数据有效性),验证条件选序列,来源框选类别那一行区域。

第三步做二级下拉:再选一列,同样打开数据验证选序列,来源不再选区域,而是输入 =INDIRECT(一级下拉所在的单元格)——一级选了「纸品」,二级下拉就只列「纸品」名称下收纳的选项。

放进我们的进销存系统,就是「先选类别,再选商品」的录入体验。

=INDIRECT(D2)

二级下拉的来源写法:D2 是一级下拉所在单元格,其内容必须与某个已定义的名称完全一致

💡 提示:

  • 二级下拉能成立的前提:每个类别名都已定义成名称,且名称与一级下拉的选项文字一字不差
  • WPS 里也可以直接用「下拉列表」功能设置,思路相同

实战演练

我们的进销存系统已经能自动记账,但销售数据按月分散记录,老板问「3 月卖得怎么样」还得翻表找。本讲给系统装上「月度汇总」模块:建几张月度分表,再做一张汇总表——A 列写月份,公式自动去对应分表把每个商品的销量、金额抓过来。这正是 INDIRECT 的主场。练习数据是本讲课件,你也可以直接在自己搭的工作簿里新建分表跟着做。

  1. 搭三张月度分表 — 新建三张工作表,分别命名为「1月」「2月」「3月」(其余月份做法完全相同)。每张表 A1:D1 写表头:商品编号、商品名称、销售数量、销售金额,下面各填 5 行左右数据(编号可沿用 WJ001、ZP001 这套规则),并在 F1 写「月合计」、F2 写 =SUM(D2:D6)。三张表结构必须完全一致,这是跨表汇总的前提。
  2. 搭汇总表骨架 — 新建「年度汇总」表:A2:A4 依次输入 1月、2月、3月;B1:D1 填三个主力商品编号(如 WJ001、ZP001、SB001)。这张表将变成一张「月份 × 商品」的矩阵。
  3. 定点取数热身 — 在 E2 输入 =INDIRECT(A2&"!F2"),下拉三行——公式自动去「1月」「2月」「3月」表里把 F2 的月合计抓过来。改 A 列的月份文字,取数立刻换表,这就是「文本变地址」的威力。
  4. 交叉矩阵全量抓取 — 在 B2 输入 =VLOOKUP(B$1,INDIRECT($A2&"!$A:$D"),3,0),先向右拖到 D 列、再向下拖到第 4 行。一行公式锁定:去 A 列月份对应的分表里,找 B1 行头的商品编号,取第 3 列销售数量——一张全年销量矩阵就自动生成了。
  5. 换口径:数量变金额 — 把矩阵里公式的第三参数 3 改成 4(销售金额所在列),同一套公式立刻变成金额矩阵,一行都不用重写。也可以复制矩阵到下方,一个放数量、一个放金额,对照着看。
  6. 单选月份的明细区 — 在 G1 单元格做数据有效性下拉(数据-数据验证-序列,来源选 =$A$2:$A$4)。G3:J3 写表头:商品编号、商品名称、销售数量、销售金额;G4 输入一个商品编号,I4 输入 =VLOOKUP(G4,INDIRECT($G$1&"!$A:$D"),3,0)、J4 输入 =VLOOKUP(G4,INDIRECT($G$1&"!$A:$D"),4,0)。切换 G1 的月份,明细自动跟着换。
  7. 容错体检 — 故意把「1月」表的表名改成「1 月」(中间加空格),观察汇总表出现 #REF!;改回表名,再把汇总表 E2 的公式换成带单引号的兜底写法 =INDIRECT("'"&A2&"'!F2"),验证对特殊表名也能正常取数。若在线环境对个别函数不支持实时重算,请对照公式在本地 Excel 中核对结果。

在线练习

下面的表格可以直接编辑,照着演练步骤在本页练习;需要菜单操作的步骤请下载配套练习文件,在自己电脑的 Excel 中完成。

表格加载中…

验收清单

逐项自查,全部通过即完成本讲:

  • ☐ 能说出 =A1、=INDIRECT(C10)、=INDIRECT("C10") 三者返回结果的区别
  • ☐ 年度汇总表里修改 A 列的月份文字,取数公式会自动换到对应分表
  • ☐ 交叉矩阵公式用对了混合引用($A2 锁列、B$1 锁行),横竖拖动都不串位
  • ☐ 遇到 #REF! 会先检查表名,并会用单引号写法修复
  • ☐ 月份下拉明细区:切换下拉选项,商品的数量和金额跟着联动刷新