Excel 2016中如何用INDIRECT实现跨工作表区域动态引用?
解决Excel INDIRECT跨多工作表求和的#REF错误问题
首先得明确:你遇到的#REF错误,核心原因是INDIRECT函数无法直接解析跨多个工作表的区域引用格式(比如'17:23'!D46这种)。它只能识别单个工作表的引用,直接把跨表范围塞进去肯定会报错。不过你的需求完全可以实现,给你两种可行的方案:
方案一:用SUMPRODUCT+INDIRECT逐个引用求和
这个方法适配Excel 2016及以上版本,不需要额外的函数支持:
=40-SUMPRODUCT(INDIRECT("'"&ROW(INDIRECT(AN3-7&":"&23))&"'!D46"))
原理拆解:
ROW(INDIRECT(AN3-7&":"&23)):当AN3=24时,这部分会生成17,18,19,20,21,22,23的数字序列,对应你要引用的工作表名。INDIRECT("'"&...&"'!D46"):逐个把每个数字转换成工作表引用,比如'17'!D46、'18'!D46等。SUMPRODUCT:把这些单个单元格的值全部加起来,替代原来的跨表SUM功能。
方案二:用TEXTJOIN+SUM(适配Excel 365/2021及以后)
如果你的Excel版本支持动态数组和TEXTJOIN,可以用更简洁的写法:
=LET( start_sheet, AN3-7, end_sheet, 23, sheet_list, TEXTJOIN(":', '", TRUE, ROW(INDIRECT(start_sheet&":"&end_sheet))), total, SUM(INDIRECT("'"&sheet_list&"'!D46")), 40-total )
原理拆解:
TEXTJOIN把生成的工作表名序列拼接成17', '18', '19'...'23的格式,再和前后的引号、感叹号组合成完整的多单元格引用。SUM直接对这些引用的单元格求和,最后用40减去总和得到结果。
注意事项:
- 确保你的工作表名确实是纯数字(1、2、3...23),如果有其他字符,需要调整引号的包裹方式。
- 方案一在Excel 2016里完全可用,方案二需要更高版本的Excel支持动态数组函数。
内容的提问来源于stack exchange,提问作者Bill Flippen
相关产品推荐
相关产品推荐

