如何通过LAMBDA递归实现STOCKHISTORY数组的非硬编码VSTACK合并?
用LAMBDA递归+VSTACK批量合并间隔分布的STOCKHISTORY数据
完全可以用LAMBDA递归实现,不用硬编码每一组数据的列范围。以下是具体的实现方案:
核心思路
通过递归LAMBDA函数遍历所有固定间隔的股票数据组,每次取对应列范围的数据,用VSTACK纵向堆叠,直到遍历完所有组为止。
非易失性公式推荐(用INDEX替代OFFSET)
假设你的数据满足:
- 起始列是A列(列号1)
- 每组数据占4列(比如A:D、E:H)
- 总共有55组股票数据
直接用下面的公式:
=LET( startCol, 1, colStep, 4, totalGroups, 55, rowCount, COUNTA(INDEX(Sheet1!$A:$XFD,0,startCol)), stackData, LAMBDA(n, IF(n>totalGroups, "", VSTACK( INDEX(Sheet1!$A:$XFD, SEQUENCE(rowCount), SEQUENCE(1,colStep,(n-1)*colStep+startCol)), stackData(n+1) ) ) ), IFERROR(stackData(1), "") )
参数说明
startCol:第一组数据的起始列号(A列填1,B列填2,以此类推)colStep:每组数据的列数(比如A:D是4列,填4)totalGroups:股票数据的总组数(50余只就填对应数字,比如55)rowCount:自动获取第一组数据的有效行数,避免包含空行stackData:递归函数,从第n组开始堆叠,直到n超过总组数时停止
调整适配你的数据
如果你的起始列、列间隔或组数不同,直接修改对应的参数即可。比如:
- 若从C列(列号3)开始,每组占5列,共52组:把
startCol改成3,colStep改成5,totalGroups改成52
注意事项
- 确保所有组的STOCKHISTORY数据行数一致,否则
VSTACK会报错。如果行数有差异,可以在rowCount里取最大行数,比如MAX(COUNTA(INDEX(Sheet1!$A:$XFD,0,startCol)), COUNTA(INDEX(Sheet1!$A:$XFD,0,startCol+colStep)))(按需扩展) - 公式生成的合并数据会自动纵向堆叠所有组,直接选中这个动态数组区域,就能导入Power Query处理
内容的提问来源于stack exchange,提问作者Mamamiya7
相关产品推荐
相关产品推荐

