如何简化包含INDIRECT引用的VSTACK函数公式?
如何简化包含INDIRECT引用的VSTACK函数公式?
嘿,我明白你的痛点——手动把每个INDIRECT塞进VSTACK里太麻烦了,尤其是后面还会新增工作表,总不能每次都改公式对吧?
先给你说清楚为什么你之前的公式会出错:你试的VSTACK(INDIRECT(N8:N140))返回错误,是因为INDIRECT(N8:N140)会生成一个引用数组,但VSTACK需要的是把多个独立的引用作为参数传入,而不是把这些引用打包成一个数组。就像你手动写的VSTACK(INDIRECT(N8),INDIRECT(N9),...)那样,每个INDIRECT都是单独的参数,直接传数组的话VSTACK没法正确解析。
下面给你两个实用的解决方案,都能帮你自动遍历所有表名,不用手动拼接:
方法一:用REDUCE函数迭代合并(推荐Excel 365/2021版本)
这个方法利用动态数组的REDUCE函数,自动遍历N列的所有表名,逐步合并每个表的数据:
=REDUCE("", FILTER(N8:N140, N8:N140<>""), LAMBDA(累积结果, 当前表名, VSTACK(累积结果, INDIRECT(当前表名))))
FILTER(N8:N140, N8:N140<>""):先过滤掉N列里的空单元格,避免处理无效的表名REDUCE会从空值开始,把每一个表的数据通过VSTACK拼接到之前的结果里,自动完成所有表的合并- 如果担心有些表可能为空或者引用出错,可以加上IFERROR跳过错误:
=REDUCE("", FILTER(N8:N140, N8:N140<>""), LAMBDA(a,b, IFERROR(VSTACK(a, INDIRECT(b)), a)))
方法二:拼接公式文本后执行(兼容更多版本)
如果你的Excel版本不支持REDUCE,可以用TEXTJOIN把所有INDIRECT拼接成完整的VSTACK公式字符串,再用EVALUATE执行:
=LET( 有效表名, FILTER(N8:N140, N8:N140<>""), 公式文本, "VSTACK(" & TEXTJOIN(",", TRUE, "INDIRECT("""&有效表名&""")") & ")", EVALUATE(公式文本) )
这个公式会先生成类似VSTACK(INDIRECT("表1"),INDIRECT("表2"),...)的文本,再让Excel执行这个文本对应的公式,效果和你手动写的完全一样,但不用手动输入每个参数。
注意事项
- 确保N列里的表名完全正确,和工作表里的表格名称一致,否则会出现#REF!错误
- 如果后续新增了工作表,只要把新的表名加到N列里,公式会自动更新合并结果,不用修改公式本身
备注:内容来源于stack exchange,提问作者Civil
相关产品推荐
相关产品推荐

