ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 问题看似简单,但我没有好的思路(写的公式很长),烦请大神们出手!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-25 08:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
递归的,刚初步写了一个,仅供参考,不是最优解,只是提供一种思路和方法。
图片.png


=LET(
    f, LAMBDA(f, arr, nums, res,  arr是A列数据,nums是C1:J1待提取行数的数字,res是结果数组
        IF(
            ISERROR(@nums),    如果nums出错,也就是nums的数字都用完了,返回res
            IFNA(DROP(res, , 1), ""),   res初始值设0,最后去掉,然后屏蔽#N/A错误
            f(
                f,
                DROP(arr, @nums),   每次去掉arr里本次要提取的行,供下次提取使用
                DROP(nums, , 1),   每次用一个数字,就去掉,这样每次nums第一个数字就是本次要提取的行
                HSTACK(res, TAKE(arr, @nums))   TAKE提取出本次要取的行,横向堆积在res右侧
            )
        )
    ),
    f(f, A1:A30, +C1:J1, 0)    设置三个参数的初始值
)



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-25 09:10 | 显示全部楼层
  1. =IFNA(DROP(REDUCE(0,SCAN(0,C1:J1,LAMBDA(x,y,x+y)),LAMBDA(a,n,HSTACK(a,CHOOSEROWS(A1:A30,ROW(INDIRECT(ROWS(TOCOL(a,3))&":"&n)))))),,1),"")
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-25 16:04 | 显示全部楼层

感谢指导,学习了。今天没有分了,明天奉上。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-25 16:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
shaowu459 发表于 2024-6-25 08:49
之所以发那个递归的帖子,主要考虑原因有以下几点:
1)再次介绍递归可以用多个参数存储中间变量、中间 ...

多谢超班的热心回复,对我而言,简单的递归还能掌握一星半点,数学底子不好,一涉及到稍高难度数学问题或是逻辑问题,我就完蛋了。但是看来递归确实是有很大的一些优势,看来硬着头皮也要啃一啃了啊。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-25 16:16 | 显示全部楼层
shaowu459 发表于 2024-6-25 08:55
递归的,刚初步写了一个,仅供参考,不是最优解,只是提供一种思路和方法。

看来递归也要好好学一学了。
超班的有关递归的部分,我再认真的学习。
但,我有点笨,数学及逻辑深一点的,就费劲。

TA的精华主题

TA的得分主题

发表于 2024-6-25 17:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. =TAKE(INDEX($A$1:$A$30,SEQUENCE(SUM($C$1:C$1))),-C1)
复制代码

向后拉就行
image.png

TA的精华主题

TA的得分主题

发表于 2024-6-25 17:49 | 显示全部楼层
C2==CHOOSEROWS($A$1:$A$30,SEQUENCE(C1,1,1+SUM($B$1:B1),1))

TA的精华主题

TA的得分主题

发表于 2024-6-25 18:26 | 显示全部楼层
本帖最后由 shaowu459 于 2024-6-25 18:39 编辑

如果拖拉的话,直接改成这样:
  1. =TAKE(TAKE($A:$A,SUM($C1:C1)),-C1)
复制代码
改成一个公式就是:
  1. =IFNA(DROP(REDUCE(0,C1:J1,LAMBDA(x,y,HSTACK(x,TAKE(TAKE(A:A,SUM(C1:y)),-y)))),,1),"")
复制代码


图片.png

TA的精华主题

TA的得分主题

发表于 2024-6-25 19:01 | 显示全部楼层
本帖最后由 edwin11891 于 2024-6-25 19:47 编辑

认真学习楼上各位的思路方法,各种奇思妙想。
为不重复,换个思路,另辟蹊径:先按照首行数字分类展开一列、跟原数据并列,然后根据分类进行重组分列。
  1. =LET(t,DROP(TEXTSPLIT(CONCAT(TOCOL(MAP(TOROW(SEQUENCE(COLUMNS(C1:J1))),C1:J1,LAMBDA(x,y,REPT(x&"@",y))),3)),,"@"),-1),Res,REDUCE("",UNIQUE(t),LAMBDA(x,y,HSTACK(x,FILTER(TAKE(A1:A30,SUM(C1:J1)),t=y)))),IFNA(DROP(Res,,1),""))
复制代码


或者:
  1. =LET(t,DROP(REDUCE(0,C1:J1,LAMBDA(x,y,VSTACK(x+1,MAKEARRAY(y,1,LAMBDA(m,n,0))))),1),Res,REDUCE("",UNIQUE(t),LAMBDA(x,y,HSTACK(x,FILTER(TAKE(A1:A30,SUM(C1:J1)),t=y)))),IFNA(DROP(Res,,1),""))
复制代码

微信图片_20240625190421.png

TA的精华主题

TA的得分主题

发表于 2024-6-26 10:18 | 显示全部楼层



尝试了一下题主老师的引申问题,因为这个问题也经常遇到,特别是OFFSET等函数的第一参数不能是引用,只能是区域,经常限制了公式的编写方法。

试验数据跟题主原数据结构保持一致,但A列是直接生成的内存数组,C1:J1同样也是。假定还是C-J列共8列,否则也可以将公式中的数字8统一换成 COLUMNS(C1:J1)即可。经尝试,公式如下(还是有点长):
  1. =LET(t,DROP(REDUCE(0,SEQUENCE(8),LAMBDA(x,y,VSTACK(x-1,MAKEARRAY(y,1,LAMBDA(m,n,8))))),1),Res,REDUCE("",UNIQUE(t),LAMBDA(x,y,HSTACK(x,FILTER(TAKE("A"&SEQUENCE(SUM(SEQUENCE(8))),SUM(SEQUENCE(8))),t=y)))),IFNA(DROP(Res,,1),""))
复制代码


微信图片_20240626101059.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 09:53 , Processed in 0.036262 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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