跳至主要内容

Excel INDIRECT():如何在公式中构建动态引用

了解 Excel 的 INDIRECT() 函数如何将文本转化为实时引用。学习将其用于动态工作表、稳定的单元格引用、命名范围等。
· 8分钟 阅读

使用 AI 探索

INDIRECT() 函数是 Excel 中最强大但也常被误解的工具之一。与直接执行计算的函数不同,INDIRECT() 会将文本字符串转换为实时的单元格引用。这使您能够创建可根据变量输入自适应的动态、灵活公式。无论您是在构建汇总仪表板、根据用户选择引用不同工作表,还是动态更改单元格引用,INDIRECT() 都能带来颠覆性效果。

在本指南中,我将向您展示如何使用 INDIRECT() 进行单元格引用,并排查常见问题,包括何时应避免使用该函数。如果您对一些基础知识还不熟悉,建议先学习我们的 Introduction to Excel 课程以打好基础。 

INDIRECT() 函数的作用

Excel 中的 INDIRECT() 函数根据作为文本字符串提供的引用,检索某个单元格或区域的值。与其在公式中硬编码单元格地址(如 "A1"),INDIRECT() 允许您使用文本动态定义该地址,Excel 会将其解释为实时引用。

INDIRECT() 函数的语法如下:

INDIRECT(ref_text, [a1])

其中:

  • ref_text(必需):表示有效单元格或区域引用的文本字符串。可以指向某个单元格(如 "A1")、命名范围,或其他工作表上的引用(如 "Sheet2!B5")。

  • [a1]:可选参数,用于指定 ref_text 的引用类型。如果 a1 为 TRUE 或省略,ref_text 将按 A1 样式解析;如果 a1 为 FALSE,则按 R1C1 样式解析。

如何使用 INDIRECT() 函数

以下示例展示了 INDIRECT() 如何动态地将文本转换为单元格引用。

假设单元格 C2 中包含文本 "A2",而单元格 A2 的值为 100。下面的函数也会返回 100,因为 Excel 读取 C2 的内容,而 INDIRECT() 将其视为引用。

=INDIRECT(C2)

在 Excel 中使用 INDIRECT() 基于另一个单元格进行引用。

在 Excel 中使用 INDIRECT() 基于另一个单元格进行引用。图片来源:作者。

如果单元格 A5 的数值为 5,您可以使用下面的公式构建一个动态引用:

=INDIRECT("B"&A5)

该公式将 "B" 与 A5 中的数值(6)拼接,形成 "B6"。随后 INDIRECT() 返回单元格 B6 的值,即 "Product A"。

在 Excel 中将 INDIRECT() 与 & 结合实现动态引用。

在 Excel 中将 INDIRECT() 与 & 结合实现动态引用。图片来源:作者。

INDIRECT() 在 Excel 中的动态用法

INDIRECT() 的真正强大之处在于其构建动态引用的能力。这使其非常适合用于高级建模、仪表板和用户驱动的报表。下面的三个关键用例展示了它的灵活性。

引用其他工作表

您可以使用 INDIRECT() 按照单元格输入,动态地从不同工作表提取数据。例如,如果在单元格 A1 中包含工作表名称,如 "Sales",您希望提取该工作表上 B2 单元格的值。

下面的公式会构造类似 'Sales'!B2 的引用,并返回该单元格的值。

=INDIRECT("'" & A1 & "'!B2")

在 Excel 中使用 INDIRECT() 间接引用其他工作表。

在 Excel 中使用 INDIRECT() 间接引用其他工作表。图片来源:作者。

如果工作表名可能包含空格或特殊字符(如 'Sales 2023'!A1),请务必使用单引号 ' 将工作表名称包裹起来。

引用命名范围

您还可以使用 INDIRECT() 动态引用命名范围,结合下拉菜单或用户输入时尤为强大。

假设您有命名范围 Sales_2023 和 Sales_2023,其中单元格 “A1” 包含 "Sales_2023"

在 Excel 中为单元格区域命名。

在 Excel 中为单元格区域命名。图片来源:作者。

下面的公式会对命名范围 Sales_2023 中的数值求和,即便公式中并未直接写出该名称。此方法非常适用于用户驱动的仪表板或包含多种情景的模型。

=SUM(INDIRECT(A1))

在 Excel 中使用 INDIRECT() 引用命名范围。

在 Excel 中使用 INDIRECT() 引用命名范围。图片来源:作者。

不随变动而改变的固定引用

通常,当您插入或删除行、列时,公式中的单元格引用会自动调整。但 INDIRECT() 会创建不会移动的绝对引用。

例如,若单元格 “A1” 的值为 100,则公式 =A1 与 =INDIRECT("A1") 都会返回 100。不过,如果您移动该数值

Excel 中的直接单元格引用。

Excel 中的直接单元格引用。图片来源:作者。

在 Excel 中使用 INDIRECT() 进行单元格引用。

在 Excel 中使用 INDIRECT() 进行单元格引用。图片来源:作者。

然而,如果您在第 1 行上方插入新行,D3(原为 B2)现在会显示 =A3,因为该值随行移动。带有 INDIRECT() 的单元格 E3 仍然显示最初的 A2,而 A2 现在可能为空或包含不同的值(UID)。

在 Excel 中使用 INDIRECT() 实现固定引用。

在 Excel 中使用 INDIRECT() 实现固定引用。图片来源:作者。

高级示例与用例

当您熟悉了基础用法后,INDIRECT() 在更高级的 Excel 场景中会大放异彩,尤其是与 VLOOKUP()、ROW() 以及动态数组等函数配合时。这些组合能解锁更强的动态性与灵活性。

将 INDIRECT() 与 VLOOKUP() 搭配

您可以将 INDIRECT() 与 VLOOKUP() 结合,根据用户输入动态切换查找表。

假设您有两个表 Prices_2022 和 Prices_2023。在不同的单元格中,G1:Prices_2022,G2:Apple`。下面的公式会基于 A1 中的值,在所选年份的表中动态查找 “Apple”,并返回其价格。

=VLOOKUP(G2, INDIRECT(G1), 2, FALSE)

在 Excel 中将 INDIRECT() 与 VLOOKUP() 结合使用。

在 Excel 中将 INDIRECT() 与 VLOOKUP() 结合使用。图片来源:作者。

查看我们的教程 VLOOKUP() from Another Sheet: A How-to in Excel,进一步了解如何在不同工作表之间搜索并提取数据。

INDIRECT() 与 R1C1 引用

INDIRECT() 也可使用 R1C1 标记法,这在宏中动态构建公式或以编程方式引用位置时尤其有用。

例如,下面的公式返回第 2 行第 3 列(单元格 C2)的值。第二个参数(FALSE)告诉 Excel 使用 R1C1 样式,而非 A1。

=INDIRECT("R2C3", FALSE)

在 Excel 中将 INDIRECT() 与 R1C1 搭配。

在 Excel 中将 INDIRECT() 与 R1C1 搭配。图片来源:作者。

下面的公式则结合了 ROW() 与 COLUMN() 的动态用法。无论公式写在哪一行,它都会返回同一行中第 3 列的值。

=INDIRECT("R" & ROW() & "C3", FALSE)

在 Excel 中将 INDIRECT() 与 ROW()、COLUMN() 结合。

在 Excel 中将 INDIRECT() 与 ROW()、COLUMN() 结合。图片来源:作者。

INDIRECT() 与动态数组

在 Excel 引入动态数组之前,INDIRECT() 常被用来模拟数组行为。

例如,下面的公式会返回一个数组:{1; 2; 3; 4; 5}。它通过间接引用行来模拟 1 到 5 的数组。

=ROW(INDIRECT("1:5"))

在 Excel 中将 INDIRECT() 与 ROW() 搭配用于动态数组。

在 Excel 中将 INDIRECT() 与 ROW() 搭配用于动态数组。图片来源:作者。

现代的替代方法是使用 SEQUENCE() 函数。

=SEQUENCE(5)

在 Excel 中使用 SEQUENCE() 生成动态数组。

在 Excel 中使用 SEQUENCE() 生成动态数组。图片来源:作者。

使用 INDIRECT() 来生成动态数组依然可行,但与现代 Excel(Office 365 和 Excel 2021+)中的 SEQUENCE()、FILTER() 等动态数组函数相比,效率更低、可读性也更差。

注意事项与性能问题

INDIRECT() 在大型或复杂的工作簿中存在一些重要限制,主要包括:

  • 易变函数(频繁重算):INDIRECT() 是易变函数,意味着无论工作簿中哪里发生任何更改,它都会重新计算,即便更改与该公式无关。这可能导致性能下降。

  • 调试较为困难:由于 INDIRECT() 是从文本构造引用,Excel 无法像标准单元格引用那样轻松跟踪它们。这会使“追踪从属/引用单元格”或在发生变更时捕捉断裂引用变得困难。

  • 考虑使用现代替代方案:在可能的情况下,优先考虑非易变、性能更好且更清晰的函数。例如用于动态单元格查找的 INDEX()、用于在预定义区域或选项间动态选择的 CHOOSE(),以及用于生成动态数字数组的 SEQUENCE()。

何时应避免使用 INDIRECT()

尽管 INDIRECT() 十分灵活强大,但并非总是最佳选择。它常会带来不必要的复杂性、性能问题或可维护性隐患。以下情形应尽量避免,并采用更佳替代方法。

  • 同一工作表内的动态单元格引用:使用 INDEX() 替代 INDIRECT(),以获得更好的性能与可追溯性。

  • 动态数组或数字序列:避免使用 =ROW(INDIRECT("1:10"))。请改用 =SEQUENCE(10),更快、更简洁,且非易变。

  • 当可追溯性很重要时:包含 INDIRECT() 的公式无法有效使用“追踪引用单元格”或“公式求值”。

  • 引用静态单元格或区域:若只需 =A1,请勿写成 INDIRECT("A1")。

  • 在大型表格中大量使用:由于 INDIRECT() 是易变函数,会不断重算,显著拖慢性能。

INDIRECT() 的替代方案

下表总结了替代 INDIRECT() 的最佳选择。

目标

优先于 INDIRECT() 的选择

动态单元格引用

INDEX()

生成序列

SEQUENCE()

条件逻辑或更简洁的公式

LET()

多情景查找

CHOOSE() 或 XLOOKUP()

灵活的工作表公式

XLOOKUP() 配合结构化数据或 Power Query

要点回顾

INDIRECT() 可将文本字符串转换为实时引用,是构建动态、灵活电子表格的强大工具。它适用于引用不同工作表、命名范围,或在变更时不应移动的固定单元格。不过,它是易变函数,会频繁重算,可能拖慢大型工作簿;与传统函数相比,也更难追踪与调试。请有选择地使用 INDIRECT(),并考虑更安全高效的替代方案。

推荐您学习我们的 Data Analysis in Excel 课程,了解 B2B 数据洞察;还可学习 Excel Fundamentals 技能路径,深入了解最新 Excel 版本中的函数。如果您正在探索高级引用与查找,我们的 Advanced Excel Functions 课程十分适合。

Allan Ouko

作者

Allan Ouko

数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。

Excel 常见问答

INDIRECT() 有什么作用?

INDIRECT() 将文本字符串转换为单元格或区域引用。

INDIRECT() 会自动更新吗?

是的,除非引用无效,否则当被引用的单元格发生变化时,INDIRECT() 会更新计算。

INDIRECT() 如何影响性能?

INDIRECT() 在工作簿中任一单元格改变时都会重新计算,因此在大型或复杂工作簿中可能因频繁重算而导致变慢。

INDIRECT() 有哪些替代方案?

使用 INDEX()、CHOOSE()、SEQUENCE() 或 LET() 更安全、更高效。

为什么 INDIRECT() 返回 #REF!?

它尝试访问的引用不存在或拼写错误。

主题