如何用INDIRECT函数替换SUM公式中的工作表名称为单元格引用值?
解决Excel INDIRECT结合SUM跨工作表范围引用的问题
问题原因
你尝试的公式=SUM(INDIRECT("'"&$G$30&":2194'!$G$17"))失效的核心原因是:INDIRECT函数无法直接解析拼接后的跨工作表范围格式。它只能识别单个工作表的引用(比如'2197'!$G$17),不能直接处理'2197:2194'!$G$17这种多工作表范围的拼接字符串。
可行解决方法
方法1:用SUMPRODUCT+ROW生成工作表序列(兼容多数Excel版本)
利用ROW函数生成从G30值到2194的所有整数序列,再通过INDIRECT逐个引用对应工作表的G17单元格,最后用SUMPRODUCT求和:
=SUMPRODUCT(INDIRECT("'"&ROW(INDIRECT($G$30&":"&2194))&"'!$G$17"))
- 原理:
ROW(INDIRECT($G$30&":"&2194))会生成从G30数值到2194的连续整数(比如G30=2197时,生成2197,2196,2195,2194),INDIRECT逐个拼接成单个工作表引用,SUMPRODUCT自动对这些值求和。
方法2:用SEQUENCE函数(Excel 365/2021及以上版本)
SEQUENCE可以更直观地生成递减的工作表名称序列,搭配SUM和INDIRECT使用:
=SUM(INDIRECT("'"&SEQUENCE($G$30-2194+1,1,$G$30,-1)&"'!$G$17"))
- 参数说明:
SEQUENCE(行数,列数,起始值,步长),这里行数是$G$30-2194+1(计算需要包含的工作表数量),步长设为-1实现从大到小的序列。
方法3:用EVALUATE解析完整求和公式(需注意版本兼容性)
如果需要直接解析SUM('X:2194'!$G$17)格式的字符串,可以借助EVALUATE函数:
- 对于Excel 365,可直接用LET函数封装:
=LET(rangeStr,"'"&$G$30&":2194'!$G$17",EVALUATE("SUM("&rangeStr&")")) - 旧版本Excel需通过定义名称实现:
- 点击公式选项卡→定义名称,输入名称(比如
SumSheetRange) - 引用位置填写:
=EVALUATE("SUM('"&Sheet1!$G$30&":2194'!$G$17)")(注意替换Sheet1为当前工作表名称) - 在E35单元格输入
=SumSheetRange即可
- 点击公式选项卡→定义名称,输入名称(比如
内容的提问来源于stack exchange,提问作者Peter Thailand
相关产品推荐
相关产品推荐

