请大佬大神帮忙优化下公式

懒得批爆
懒得批爆

创作者俱乐部成员

每次帮人家优化公式的时候,一把好手。

自己写的公式就不会优化了,真闹心。


先说下场景,有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倍,这....我此时应该怎么表达内心的激动!!!

最后感谢各位大神伸手相助。

四川省
浏览 814
1
34
分享
34 +1
39
1 +1
全部评论 39
 
liaobin
谢谢分享
· 浙江省
回复
 
『峰格』
打卡
· 山东省
回复
 
uibpqds
看法就不说了,光是把这个问题描述出来就已经吊打了
· 河南省
1
回复
 
liaobin
学习了
· 浙江省
回复
 
LG
1
· 中国
回复
 
云凡
666
· 四川省
回复
 
马成功老师
马成功老师

创作者俱乐部成员

评论里真是神仙“打架”。看着等级号不高,实则是隐忍不发的世外高人。
· 北京
回复
 
那谁谁ృ༊゜
打卡
· 广东省
回复
 
水墨染青花
能力不够,只能说句“牛13”来凑
· 四川省
回复
 
『峰格』
打卡
· 山东省
回复
 
浮昵.
不明觉厉。
· 江苏省
回复
 
方盛
方盛

创作者俱乐部成员

我虽然看不懂,但是挺佩服
· 湖北省
回复
 
寻残梦
666
· 广东省
回复
 
WPS 冲浪队长
WPS 冲浪队长

社区管理员

爱看!
· 广东省
1
回复
 
Boyuan
具体应用情况不知, 仅作长度优化: =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,A3:B36,2,0),SORTBY(A,B))
· 河南省
1
回复
懒得批爆
懒得批爆

创作者俱乐部成员

走上一条新思绪的道路,感谢大神的相助。
· 四川省
回复
 
千叶
第一步可以先tocol在去重, 优点是不用再管多少行 第二步其实也可以直接优化第一步的 UNIQUE(TOCOL('2022-日:2024-日'!V:V,3)) 这样第一步就可以不用了 排序的话可以用XMATCH来定位,然后在和去重的数组组合, 在排序删掉定位 试试看:=LET(ARR,UNIQUE(TOCOL('2022-日:2024-日'!V:V,3)),DROP(SORT(HSTACK(XMATCH(ARR,$N$4:$N$26),ARR)),,1))
· 江西省
1
回复
千叶
优化一下 =LET(ARR,DROP(UNIQUE(TOCOL('2022-日:2024-日'!V:V,3)),1),DROP(SORT(HSTACK(XMATCH(ARR,$N$4:$N$26),ARR)),,1))
· 江西省
1
回复
 
wils
wils

创作者俱乐部成员

公式是真做不到啊。。。 不过新建了一个表,含3个sheet,分别有5万6万7万行随机数,然后用adodb连接表,写sql连起来,排序去重,这个是1秒以内完成的 用importexcel模块读则会卡住 Python打开有点慢,后面连起来去重排序很快 还没试js宏,这个应该很快
· 海南省
1
回复
懒得批爆
懒得批爆

创作者俱乐部成员

大神的方法需要环境 我在mac上使用,偶尔换到windows上使用,我用的是wps和m365 然后这个文件会发给同事们使用,每周更新 同事用的wps和永中 环境很复杂
· 四川省
1
回复
 
二毛陀
打卡
· 广东省
1
回复
 
ice y
ice y

创作者俱乐部成员

虽然看不懂,但是感觉你很厉害
· 四川省
1
回复
 
马成功老师
马成功老师

创作者俱乐部成员

完了,这个函数,我今生今世是绝对看不懂了。爱莫能助。只好默默地点赞离开
· 北京
回复