自用的二维表转一维表的通用公式

=LET(hqy,A4:C9,lqy,D1:G3,sjqy,D4:G9,

lb,LAMBDA(a,b,IF(b="h",TRANSPOSE(SCAN("",TRANSPOSE(a),LAMBDA(x,y,IF(y="",x,y)))),SCAN("",a,LAMBDA(x,y,IF(y="",x,y))))),

hhb,MAKEARRAY(ROWS(lb(hqy,"h")),1,LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(hqy,"h"),r,SEQUENCE(1,COLUMNS(lb(hqy,"h"))))))),

lhb,MAKEARRAY(1,COLUMNS(lb(lqy,"l")),LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(lqy,"l"),SEQUENCE(1,ROWS(lb(lqy,"l"))),c)))),

eb,TEXTSPLIT(TEXTJOIN("|",0,hhb&"@"&lhb&"@"&sjqy),"@","|"),

sb,LAMBDA(x,TEXTSPLIT(TEXTJOIN("+",,CHOOSECOLS(eb,x)),"-","+")),

HSTACK(sb(1),sb(2),CHOOSECOLS(eb,3)))

使用:只需要修改第一行标注红颜色的三个区域,分别是行标签区域、列标签区域以及值区域

公式解释:

  1. lb,LAMBDA(a,b,IF(b="h",TRANSPOSE(SCAN("",TRANSPOSE(a),LAMBDA(x,y,IF(y="",x,y)))),SCAN("",a,LAMBDA(x,y,IF(y="",x,y)))))

第一步定义了填充合并单元格的函数,许多二维表的行列标签有合并单元格,例如下图

  1. hhb,MAKEARRAY(ROWS(lb(hqy,"h")),1,LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(hqy,"h"),r,SEQUENCE(1,COLUMNS(lb(hqy,"h")))))))

把所有行标签合并成一列,如下图:

  1. lhb,MAKEARRAY(1,COLUMNS(lb(lqy,"l")),LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(lqy,"l"),SEQUENCE(1,ROWS(lb(lqy,"l"))),c))))

把所有列标签合并成一行,如下图:

4、eb,TEXTSPLIT(TEXTJOIN("|",0,hhb&"@"&lhb&"@"&sjqy),"@","|"),

sb,LAMBDA(x,TEXTSPLIT(TEXTJOIN("+",,CHOOSECOLS(eb,x)),"-","+"))

把第2步和第3步的结果以及二维表的值拼接转换为一维表,如下图:

5、sb,LAMBDA(x,TEXTSPLIT(TEXTJOIN("+",,CHOOSECOLS(eb,x)),"-","+"))

定义了一个拆分函数,用于拆分第4步形成的一维表的第一列和第二列,如下图:

6、HSTACK(sb(1),sb(2),CHOOSECOLS(eb,3))

运用第5步定义的函数拆分第4步形成的数组的第一列和第二列,然后把所有拆分结果和第4步形成的数组的第三列横向拼接,就生成了最终的一维表,如下图:

这是我学习函数以来第一次发帖,deepseek给了我很大的帮助,公式中肯定有许多可以继续改进的,大家有好的改进建议我会及时修改公式,谢谢大家的阅读。

山西省
浏览 429
收藏
5
分享
5 +1
7
+1
全部评论 7
 
人工智能能够为我们带来更多的便利和创新。
· 辽宁省
3
回复
是了,最近感觉确实如此
· 山西省
1
回复
 
wils

创作者俱乐部成员

厉害 感觉可以把每一个小函数都弄成标准化的,放到名称管理器里 可以最后整合成完整的功能,也可以只用其中的一个功能
· 广东省
1
回复
谢谢建议,我照你说的试试
· 山西省
1
回复