本帖最后由 edwin11891 于 2024-11-5 15:46 编辑
优化一下,实现:
1. 只汇总工作表名称为“上数**”开头的工作表;
2. 工作表内只有一个区域数据(如示例),开始列(如B列)、结束列(如I列)均由公式自动判断;
3. 增加、删除数据页,均不需要修改公式,只需要保持数据样式(顶行为类型,下面的数据区,且数据区第一行为标题;第三列为总数),公式均自动汇总。
- =LET(fx,LAMBDA(x,y,TOCOL(IF(y<>"",x,1/0),2,1)),fy,LAMBDA(XX,YY,ZZ,SS,Srd,IFNA(HSTACK(fx(XX,Srd),YY,fx(ZZ,Srd),fx(SS,Srd),fx(Srd,Srd)),YY)),sht,SHEETSNAME(,1,1),ShName,FILTER(sht,LEFT(sht,2)="上数"),sInfo,REDUCE("",ShName,LAMBDA(x,y,VSTACK(x,LET(Rc,INDIRECT("'"&y&"'!A1:Z100"),Nr,BYCOL(Rc,COUNTA),nLeft,MIN(MAP(SEQUENCE(25),LAMBDA(x,IF(INDEX(Nr,,x)=(INDEX(Nr,,x+1)+1),x,999)))),sCol,SUBSTITUTE(ADDRESS(1,nLeft,4),1,),Src,INDIRECT("'"&y&"'!"&sCol&"1:"&sCol&"100"),nType,XMATCH(1=1,Src<>"",,1),nEnd,LOOKUP("座",Src,ROW(1:100)),sEnd,SUM(N(INDIRECT("'"&y&"'!"&sCol&(1+nType)&":Z"&(1+nType))<>"")),sData,OFFSET(Src,nType,,nEnd-nType,sEnd),Sa,TAKE(TAKE(sData,,3-sEnd),1),Sb,DROP(TAKE(sData,,1),1),Sc,DROP(CHOOSECOLS(sData,2),1),Sd,OFFSET(Src,nType-1,,1,),Se,DROP(TAKE(sData,,3-sEnd),1),Sf,fy(Sa,Sd,Sb,Sc,Se),Sf)))),SORT(DROP(sInfo,1)))
复制代码
|