1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

帖子
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 947|回复: 36

[已解决] 連續相同數字 分列取出

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-3-19 14:13 | 显示全部楼层 |阅读模式
image.png

TA的精华主题

TA的得分主题

发表于 2025-3-19 14:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 shaowu459 于 2025-3-19 14:51 编辑

请忽略公式长短,继续推广一下我一个帖子里的针对此类问题(从上到下,根据一定的条件分组、提取、变换、堆积)的通用做法。优点是可以忽略特殊的技术细节,一个套路完成。

递归替换REDUCE某类循环方式的一种方法(完结)
https://club.excelhome.net/thread-1694233-1-1.html

  1. =LET(f,LAMBDA(f,arr,res,LET(s,MATCH(1=1,arr<>@arr,),IF(@arr=0,IFNA(DROP(res,,1),""),IF(s>2,f(f,DROP(arr,s-1),HSTACK(res,TAKE(arr,s-1))),f(f,DROP(arr,1),res))))),f(f,+B1:B15,0))
复制代码
上面退出条件写的是=0,主要是看数据源没有0值。如果可能包括0值,将退出条件改成=""即可。注意:公式选择了数据区域下方的空白单元格。
  1. =LET(f,LAMBDA(f,arr,res,LET(s,MATCH(1=1,arr<>@arr,),IF(@arr="",IFNA(DROP(res,,1),""),IF(s>2,f(f,DROP(arr,s-1),HSTACK(res,TAKE(arr,s-1))),f(f,DROP(arr,1),res))))),f(f,+B1:B15,0))
复制代码

图片.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-19 14:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
对2楼公式的简单说明如下:

图片.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-19 14:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 hugeinfo 于 2025-3-19 15:04 编辑

=LET(a,LET(r,SCAN(,A2:A13,LAMBDA(x,y,IF(y=OFFSET(y,-1,),x,x+1))),DROP(REDUCE("",SEQUENCE(MAX(r)),LAMBDA(x,y,IFNA(HSTACK(x,IF(COUNTA(FILTER($A$2:$A$13,r=y))>1,FILTER($A$2:$A$13,r=y),"")),""))),,1)),FILTER(a,TAKE(a,1,)<>""))

image.png



我理解意思就是 只要求出=SCAN(,A2:A13,LAMBDA(x,y,IF(y=OFFSET(y,-1,),x,x+1)))  也就b列的值    image.png 那就好解决  解决方法很多    是否可以这样理解   

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-19 15:15 | 显示全部楼层
超版用的递归,我还是循环吧:
  1. =LET(s,SCAN(0,B2:B14,LAMBDA(x,y,IF(y=OFFSET(y,-1,),x,x+1))),R,GROUPBY(s,s,COUNT,0,0,),Rs,FILTER(TAKE(R,,1),TAKE(R,,-1)>1),Re,DROP(REDUCE("",Rs,LAMBDA(x,y,HSTACK(x,FILTER(B2:B14,s=y)))),,1),IFERROR(Re,""))
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-19 15:21 | 显示全部楼层
edwin11891 发表于 2025-3-19 15:15
超版用的递归,我还是循环吧:

测试了下,你这个ok。wps前年底增加动态数组函数后,let这个函数,我几乎没用过。瞅了眼你用的let,感觉是可以从左到右逐步带入。如果数据量大,这种方法,是不是会增加计算量或者耗费内存过大?

TA的精华主题

TA的得分主题

发表于 2025-3-19 15:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
人有言兮是然 发表于 2025-3-19 15:21
测试了下,你这个ok。wps前年底增加动态数组函数后,let这个函数,我几乎没用过。瞅了眼你用的let,感觉 ...

没有专门测试过,貌似运算效率跟WPS对函数自身的优化有关,比如GROUPBY函数,貌似复杂,其实其运算效率是非常快的,比类似其它函数快很多。
LET函数是解决复杂问题、编程式公式的有效工具,新函数的动态数组也比传统的下拉方式效率高很多。

TA的精华主题

TA的得分主题

发表于 2025-3-19 15:33 | 显示全部楼层
  1. =IFERROR(IF(ROW(),N(OFFSET($B$1,ROW(INDIRECT(TEXT(NPV(99,SMALL(IF(CHOOSE({1,2},($B$3:$B$15<>$B$2:$B$14)+($B$1:$B$13=$B$2:$B$14),($B$3:$B$15=$B$2:$B$14)+($B$1:$B$13<>$B$2:$B$14))=0,ROW($2:$14)),COLUMN(A1)*2-{1;0}))/1%%,"0!:00")))-1,)),""),"")
复制代码
单说只要结果来说,思路困难度为0,但是老版本写起来太坑了。竖向区域数组右拉

评分

3

查看全部评分

头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-19 15:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-19 15:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-4-1 14:13 , Processed in 0.028524 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表