Excel公式瘦身秘诀:从700字符到98字符的优化之旅 点击使用AI助手 了解更多
发布于 2024-09-29 liusiyang 92 编辑
每次帮人家优化公式的时候,一把好手。
自己写的公式就不会优化了,真闹心。
先说下场景,有3个工作表,分别对应2022、2023、2024三年的销售明细表,2024年的明细表还要后续累加。
sheet名分别为:2022-日,2023-日,2024-日;(这里的日是日明细的意思,没有其他的暗指)
每年的数据为4万~5万行,
虽然数据很多,但结构一致,
🔔 | 现在需要将各表V列的内容列为一整列,并按标准顺序$N$4:$N$26排序。 |
目前自己写的公式如下(大约673个字符),请大佬帮忙优化:
=SORTBY(INDEX(HSTACK(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),VLOOKUP(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),$N$4:$O$26,2,0)),,1),INDEX(HSTACK(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),VLOOKUP(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),$N$4:$O$26,2,0)),,2),1)
以上公司的制作思路如下:
第一步
2022-日,2023-日,2024-日三个表V列的数据去重单列出来,因为行数不一样,为了方便复制,统一设为5万行,后面复制只修改表名就可以了:
=TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)
=TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3)
=TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3)
第二步
将这三列数据放在一列里,并去重去错
=UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3))
第三步
在指定顺序列旁边创建一个辅助列只为生成对应的序号
=SEQUENCE(COUNTA(N4:N26),1,1,1)
第四步
将第二步的数据映射出排序的序号
=VLOOKUP(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),$N$4:$O$26,2,0)
为什么这里没有直接使用SROTBY?因为标准顺序$N$4:$N$26中有些单元格不在这三个表中出现过,但以后可能会出现,所以这些还不能去除,如果这里用SORTBY会出现#VALUE!错误。
第五步
然后将第四步和第二步的两列数据合并为一个数组
=HSTACK(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),VLOOKUP(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),$N$4:$O$26,2,0))
第六步
将第五步的数组进行排序,这里的思路是用INDEX,对COLUMN(2)排序,留下COLUMN(1)
=SORTBY(INDEX(HSTACK(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),VLOOKUP(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),$N$4:$O$26,2,0)),,1),INDEX(HSTACK(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),VLOOKUP(UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),$N$4:$O$26,2,0)),,2),1)
纯公式看起来不是很直观,所以建了个在线表格,方便查看。有很多函数在金山文档的支持不是太好,所以建议另存为本地文件后再行编辑。
❌ | 【金山文档 | WPS云文档】 对三个表V列不重复且按标准顺序排序 |
实在是对不住,中午应该是饿昏了,刚刚检查了下,发现没有对,原来是少了个辅助列,请用下面这份,上面的别用了。
✔️ | 【金山文档 | WPS云文档】 对三个表V列不重复且按标准顺序排序 |
==========================手动分隔线==========================
首先感谢各位大神提供的思路。
我先自行研究了下,用DROP替换了INDEX,公式字符数减少了一半,依旧有300+的字符🤗🤗🤗。
=DROP(SORT(HSTACK(UNIQUE(VSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3))),VLOOKUP(UNIQUE(VSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3))),$N$4:$O$26,2,0)),2,1),,-1)
随后看到了 wils大神 的方案,经转换为实际工作中的公式后发现减少到188个字符😍😍😍😍😍😍。
=LET(a,UNIQUE(TOCOL(HSTACK(TOCOL(UNIQUE('2024-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2023-日'!$V$2:$V$50000),3),TOCOL(UNIQUE('2022-日'!$V$2:$V$50000),3)),3)),b,MATCH(a,$N$4:$N$26,0),SORTBY(a,b))
接着是 Boyuan大神 的方案,经转换为实际工作中的公式后发现字符再次减少为167个字符🥰🥰🥰🥰🥰。
=LET(A,UNIQUE(VSTACK(TOCOL(UNIQUE('2024-日'!V2:V50000),3),TOCOL(UNIQUE('2023-日'!V2:V50000),3),TOCOL(UNIQUE('2022-日'!V2:V50000),3))),B,VLOOKUP(A,N4:O26,2,0),SORTBY(A,B))
最后是 千叶大神 的方案,仅转换为实际工作中的公式后,发现公式只剩下98个字符了,石化❗震惊❗❗
此时已经处于亚麻呆住的状态❗❗❗😮😱😱😱😱👏👏👏👏
=LET(a,DROP(UNIQUE(TOCOL('2024-日:2022-日'!V:V,3)),1),DROP(SORT(HSTACK(XMATCH(a,$N$4:$N$26),a)),,1))
千叶大神 将接近700个字符的公式优化为不到100个字符的公式,瘦身7倍,这....我此时应该怎么表达内心的激动!!!
最后感谢各位大神伸手相助。
原文链接:https://bbs.wps.cn/topic/33444