夜雨聆风学习资料网

ARTICLE · 1120879

合并单元格混着小计行,AI写了3种解法,最短205个字符

合并单元格混着小计行,AI写了3种解法,最短205个字符

🤯合并单元格混着小计行,AI写了3种解法,最短205个字符

做需求计划的人,谁没接过这种表。
上个月一家整车厂的主计划员找我,丢过来一张11月需求计划:129行明细,12个小计行,车系是合并单元格,车型系列还是合并单元格,横向的周次表头也不老实——第44周占3列,第45到47周各占7列,第48周占6列。合并单元格套着合并单元格,小计行混在明细里。
他问我:这种表,透视表点不动,筛选出来一堆空行,手动复制粘贴,两个小时没了。我说你别动,让AI来写。一小时不到,它给了3种解法,最短的一个公式,205个字符。

一、场景定义

先把表的样子说清楚。原始数据长这样:
纵向
:车系、车型系列都是合并单元格,中间还插着"车型1 小计"这种小计行
横向
:周次表头也是合并的,44周到48周,每周边界都不一样宽
要的目标
:把这张乱表压平,按车型×周次汇总,行带总计、列带总计
这个场景放到哪个行业都成立:整车厂的周需求、注塑车间的周排产、零售门店的周补货,骨架一模一样——纵向合并+小计行混排+横向不规则合并表头,三座大山同时压过来。
3种解法,思路完全不同:一个借力降维,一个矩阵映射,一个自建明细链。下面挨个拆。

二、方法一:借小计行降维(205字符)

业务场景:整车厂周需求,车型×周次,129行明细里藏着12个小计行。
AI的思路很鸡贼:别人都盯着明细行,它直接盯上了小计行。小计行有个天然特征——销售编码为空。筛选函数按这个条件一抓,12个小计行到手,所有合并单元格全部跳过,一个都不用填。
公式:小计行一步透视
=LET(A,FILTER(主机厂需求!B4:AI144,主机厂需求!D4:D144=""),E,DROP(A,,4),PIVOTBY(TOCOL(IF(E<>"",TAKE(A,,1),NA()),3),TOCOL(IF(E<>"",SCAN("",主机厂需求!F2:AI2,LAMBDA(X,Y,IF(Y="",X,Y))),NA()),3),TOCOL(IF(E<>"",E,NA()),3),SUM))
FILTER
:借小计行——D列销售编码为空的就是小计,一网打尽
SCAN
:横向周次表头是合并的,扫描函数把每周边界补齐
IF+TOCOL(,3)
:三个矩阵逐元素对齐,压成车型、周次、数量三根长列
PIVOTBY
:透视汇总,行总计列总计自动带出
205个字符,3种里最短,一步透视出全套表头和总计,推荐指数★★★★★。

依赖小计行

D列为空这个约定

,哪天小计行填了编码就失效;分组还会按文本自动重排,车型1→10→11→12→2,不是源表顺序。

三、方法二:矩阵映射(285字符)

还是同一张表,但AI换了个世界观:不筛选、不透视,用线性代数。
它的想法是,把周次那一行变成一张0和1的映射矩阵——每个格子标记"这个数属于哪一周"。然后数量矩阵跟映射矩阵做一次矩阵乘法,5周的汇总加总计,一乘就出来了。
公式:0/1矩阵一次乘法出汇总
=LET(A,FILTER(主机厂需求!B4:AI144,主机厂需求!D4:D144=""),Q,DROP(A,,4),W,SCAN("",主机厂需求!F2:AI2,LAMBDA(x,y,IF(y="",x,y))),U,UNIQUE(TOCOL(W)),V,MMULT(Q,HSTACK(TRANSPOSE(--(W=U)),SEQUENCE(30)^0)),VSTACK(HSTACK("车型",TOROW(U),"总计"),HSTACK(TAKE(A,,1),V),HSTACK("总计",MMULT(TRANSPOSE(SEQUENCE(12)^0),V))))
UNIQUE+TOCOL
:把周次去重成5周
--(W=U)
:横向30格跟5周比对,生成30×5的0/1映射矩阵
MMULT
:数量矩阵乘映射矩阵,一次乘法出周汇总,后面全1列顺手带出行总计
VSTACK/HSTACK
:表头、行总计、列总计手工拼装
285个字符,推荐指数★★★。它是3种里唯一保留源表行序的——小计透视会重排,矩阵映射不会。

矩阵乘法拒绝逻辑值,0/1矩阵必须用

双横线强转成数值

;两个矩阵还必须一横一纵才能广播,两个横向矩阵撞一起直接报错;车型数上千的时候,

平方级的计算量

要悠着点。

四、方法三:自建明细链(261字符)

前两种都靠小计行帮忙。第三种反着来:把小计行扔掉,自己建链。
AI反向筛选,抓出129行纯明细。B列的合并车型没人填?扫描函数纵向逐格填充,把每个空格都补上车名。数字列有空格?先归零托底,再做透视。
公式:明细行自建链+透视
=LET(A,FILTER(主机厂需求!B4:AI144,主机厂需求!D4:D144<>""),T,SCAN("",TAKE(A,,1),LAMBDA(x,y,IF(y="",x,y))),Q,IFERROR(--DROP(A,,4),0),W,SCAN("",主机厂需求!F2:AI2,LAMBDA(x,y,IF(y="",x,y))),PIVOTBY(TOCOL(IF(Q<>"",T,NA()),3),TOCOL(IF(Q<>"",W,NA()),3),TOCOL(IF(Q<>"",Q,NA()),3),SUM))
FILTER条件反过来
:D列不等于空,抓的是129行纯明细
SCAN纵向填充
:B列合并车型逐格补齐(必须先筛选再扫描,顺序反了会被小计文本污染)
IFERROR(--Q,0)
:空值归零托底,不做这步,没有数据的周次整列直接蒸发
PIVOTBY
:老骨架复用,透视出表
261个字符,推荐指数★★★★。它是3种里最健壮的——不依赖小计行约定,源表把小计删了照样能算。

代价是

计算量最大

:129行明细长表化,3870对逐元素运算;

先筛选再扫描的顺序死规矩

,反了车型归属全乱。

五、方法对比排名

排名

方法

长度

精简思路

推荐

1

借小计行降维

205字符

筛选抓小计+透视一步出表

★★★★★

2

明细自建链

261字符

反筛明细+扫描填充+透视

★★★★

3

矩阵映射

285字符

0/1映射矩阵+一次乘法

★★★

最短的未必适合你。数据规矩、小计行可靠,用方法一;表会被别人动来动去,用方法三;死活要保源表行序,用方法二。

一句口诀:

最短借小计,健壮建明细,保序用矩阵

。

六、避坑清单

这次实战踩出来的坑,条条带现场:
广播有方向
:横向数组配纵向标签才能广播成矩阵,两个横向撞一起是#N/A
矩阵乘法拒绝逻辑值
,0/1矩阵必须双横线强转,否则整列报错
透视函数只为出现过的值建列
,明细空值必须归零托底,否则整周蒸发
先筛选再扫描
,顺序反了,车型归属被"XX小计"文本污染
双横线转空字符串报#VALUE!
,要用容错函数包,不能用IFNA
读合并行的值要typed_value,普通读法会被压缩成一行
动态目录的表名函数必须带引用范围
,省略写法会把源数据表也卷进来
动态数组溢出区是矩形铁桶
,里面塞任何独立公式都会打架

术语解释

LET(让公式先起名字):把长公式里的中间结果起个名字反复用,像给零件编号,公式短一半还不出错。
FILTER(筛选函数):按条件把符合条件的行一把抓出来,相当于自动化的高级筛选。
PIVOTBY(按维透视函数):数据透视表的公式版,指定行维度、列维度,自动分组汇总,还自带行列总计。
SCAN(累计扫描函数):从上往下逐格扫过去,空格就继承上一格的值——专治合并单元格。
LAMBDA(拉姆达,匿名函数):临时定义的一小段逻辑,写在公式里直接用,不用单独建宏。
MMULT(矩阵乘法函数):线性代数里的矩阵相乘,这里用来"一次乘法完成分组求和"。
TOCOL(转一列函数):把一个二维矩阵压成一根竖列,压的时候自动丢弃空值。
动态数组(Dynamic Array):一个公式吐出一片结果,自动往下往右溢出,不用拖填充。

#AI写表格公式#动态数组#WPS表格#合并单元格#生产计划

本文公式由 AI 生成
工具:灵犀专业版
模型:GLM-5.3-Flash 高

相关学习资料