You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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), 生成序列)
        )
    ))
)

公式说明

  1. LET函数定义变量,拆分原始数组为各列,简化后续逻辑编写
  2. BYROW遍历每行数据,对每行执行自定义LAMBDA逻辑
  3. 核心判断:
    • 当当前C值 <= 当前D值时,用SEQUENCE(,当前D值+1,0)生成水平方向的0到D值序列(当前D值+1是因为要包含0和D值本身)
    • 当当前C值 > 当前D值时,直接返回C值,不生成补0序列
  4. 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)
)

公式说明

  1. 用SEQUENCE(当前D值+1,1,0)生成垂直方向的0到D值序列,C>D时返回单个C值
  2. REPT函数将当前姓名和B值重复对应序列的行数,保证每个序列值都有匹配的姓名和B值
  3. TOCOL(行内序列, 3)将所有行的结果合并为一个连续的动态数组,自动过滤空值

内容的提问来源于stack exchange,提问作者O.P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:25:33