求助:Excel 365无VBA用动态数组按规则生成数字
Excel 365动态数组实现:按Name生成0至D列限值的序列(C>D时不补0)
核心需求回顾
- 基于A列的Name,结合每行B、C、D列数据,生成从0到D列限值的序列
- 若当前行C列数值大于D列,无需生成0到D的补全序列,直接保留C列值
- 需以Excel 365动态数组形式实现,自动溢出结果
水平序列输出(每行对应一个水平序列)
直接在任意空白单元格输入以下公式,会自动溢出所有结果:
=LET( 原始数据, A1#, 姓名列, INDEX(原始数据,,1), B列, INDEX(原始数据,,2), C列, INDEX(原始数据,,3), D列, INDEX(原始数据,,4), BYROW(HSTACK(姓名列, B列, C列, D列), LAMBDA(当前行, LET( 当前姓名, INDEX(当前行,1), 当前C值, INDEX(当前行,3), 当前D值, INDEX(当前行,4), 生成序列, IF(当前C值 <= 当前D值, SEQUENCE(,当前D值+1,0), 当前C值), HSTACK(当前姓名, INDEX(当前行,2), 生成序列) ) )) )
公式说明
LET函数定义变量,拆分原始数组为各列,简化后续逻辑编写BYROW遍历每行数据,对每行执行自定义LAMBDA逻辑- 核心判断:
- 当
当前C值 <= 当前D值时,用SEQUENCE(,当前D值+1,0)生成水平方向的0到D值序列(当前D值+1是因为要包含0和D值本身) - 当
当前C值 > 当前D值时,直接返回C值,不生成补0序列
- 当
HSTACK将姓名、B列值和生成的序列合并为一行,最终自动溢出所有结果
纵向展开输出(每个序列值对应独立行)
如果需要把每个序列值单独占一行(对应相同的姓名和B列值),使用以下公式:
=LET( 原始数据, A1#, 姓名列, INDEX(原始数据,,1), B列, INDEX(原始数据,,2), C列, INDEX(原始数据,,3), D列, INDEX(原始数据,,4), 行内序列, BYROW(原始数据, LAMBDA(当前行, LET( 当前姓名, INDEX(当前行,1), 当前B值, INDEX(当前行,2), 当前C值, INDEX(当前行,3), 当前D值, INDEX(当前行,4), 目标序列, IF(当前C值 > 当前D值, 当前C值, SEQUENCE(当前D值+1,1,0)), HSTACK(REPT(当前姓名, ROWS(目标序列)), REPT(当前B值, ROWS(目标序列)), 目标序列) ) )), TOCOL(行内序列, 3) )
公式说明
- 用
SEQUENCE(当前D值+1,1,0)生成垂直方向的0到D值序列,C>D时返回单个C值 REPT函数将当前姓名和B值重复对应序列的行数,保证每个序列值都有匹配的姓名和B值TOCOL(行内序列, 3)将所有行的结果合并为一个连续的动态数组,自动过滤空值
内容的提问来源于stack exchange,提问作者O.P
相关产品推荐
相关产品推荐

