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列不重复且按标准顺序排序

https://kdocs.cn/l/cp4AX1AsCmdc

实在是对不住,中午应该是饿昏了,刚刚检查了下,发现没有对,原来是少了个辅助列,请用下面这份,上面的别用了。

✔️

【金山文档 | WPS云文档】 对三个表V列不重复且按标准顺序排序

https://kdocs.cn/l/cpp7D33KyLk1



==========================手动分隔线==========================



首先感谢各位大神提供的思路。

我先自行研究了下,用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

上一篇: Excel数据输入与管理操作指南
下一篇: 如何在Excel表格中隐藏工作表和行列
相关文章