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

Excel多动态数组汇总至年月表:新增债券无需重复公式方案

纯函数式解决债券年月匹配动态更新问题

问题现状

  • 债券表中,单条债券的付款计划用公式生成:=TRANSPOSE(EDATE(C4,SEQUENCE(B4,1,6,6)))
  • 年月表的年份序列公式:=TRANSPOSE(SEQUENCE(YEAR(MAX(E3:Z4))-YEAR(MIN(E3:Z4))+1,1,YEAR(MIN(E3:Z4))))
  • 年月表单元格需要逐行添加类似=IF(OR((MONTH($E$3#)=$B12)*(YEAR($E$3#)=C$11)),$D$3,0)+IF(OR((MONTH($E$4#)=$B12)*(YEAR($E$4#)=C$11)),$D$4,0)的公式,新增债券行时必须手动追加,易触发公式长度上限。

纯函数式解决方案

以下方案基于Excel 365/2021的动态数组功能,无需手动修改公式,新增债券行自动生效:

1. 动态生成所有债券的付款日期与对应金额

用动态数组统一生成所有债券的付款日期,并匹配对应金额(每条债券的金额重复对应其付款次数):

  • 动态日期数组(可直接写在辅助单元格或名称管理器):

    =TOCOL(BYROW(FILTER(B:D,B:B<>""),LAMBDA(row,TRANSPOSE(EDATE(INDEX(row,2),SEQUENCE(INDEX(row,1),1,6,6))))),1)
    

    说明:FILTER(B:D,B:B<>"")自动筛选所有非空债券行;BYROW逐行生成单条债券的付款计划;TOCOL把所有横向的付款日期转成一列,方便后续计算。

  • 动态金额数组:

    =TOCOL(INDEX(FILTER(B:D,B:B<>""),,4),1,COUNTIF(INDEX(FILTER(B:D,B:B<>""),,2),">0"))
    

    说明:提取所有债券的金额列,按每条债券的付款次数重复对应金额,确保和日期数组的行数一一匹配。

2. 动态生成年月表的年份序列

替换原年份序列公式,自动识别所有付款日期的起止年份:

=TRANSPOSE(SEQUENCE(YEAR(MAX(动态日期数组))-YEAR(MIN(动态日期数组))+1,1,YEAR(MIN(动态日期数组))))

直接引用第一步的动态日期数组,新增债券后自动更新起止年份。

3. 年月表核心计算(自动匹配所有债券)

在年月表的左上角单元格(比如C12)输入以下数组公式,回车后自动填充整个结果区域:

=BYROW(B12:B23,LAMBDA(month_val,
    BYCOL(C11:Z11,LAMBDA(year_val,
        SUM(IF((MONTH(动态日期数组)=month_val)*(YEAR(动态日期数组)=year_val),动态金额数组,0))
    ))
))

说明:BYROW遍历所有月份,BYCOL遍历所有年份,对每个年月组合,自动计算所有债券中对应日期的金额总和,新增债券行时无需修改此公式。

额外优化

如果不想用辅助单元格,可把动态日期和金额数组直接嵌套进核心公式,避免额外单元格占用:

=LET(
    bonds,FILTER(B:D,B:B<>""),
    dates,TOCOL(BYROW(bonds,LAMBDA(r,TRANSPOSE(EDATE(INDEX(r,2),SEQUENCE(INDEX(r,1),1,6,6))))),1),
    amounts,TOCOL(INDEX(bonds,,4),1,COUNTIF(INDEX(bonds,,2),">0")),
    BYROW(B12:B23,LAMBDA(m,
        BYCOL(C11:Z11,LAMBDA(y,
            SUM(IF((MONTH(dates)=m)*(YEAR(dates)=y),amounts,0))
        ))
    ))
)

LET函数把中间变量封装起来,公式更简洁易读,新增债券行时自动识别并计算。

内容的提问来源于stack exchange,提问作者rew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:10:26