使用Reduce函数计算发票在指定年份的月份数问题
解决方案:适配跨年度发票的月份统计公式
问题分析
原公式失效的核心原因是REDUCE+XMATCH的逻辑错误:它试图累加目标年份在月份年份数组中的匹配位置,而非统计每个目标年份的出现次数,无法适配跨年度场景。
修正公式
直接使用COUNTIF的数组特性即可实现需求,逻辑更简洁且支持跨年度发票:
=COUNTIF(YEAR(EDATE(Table2[@[Retro Start Date]], SEQUENCE(Table2[@[Invoice Months]], 1, 0))), $V$2#)
公式逻辑拆解
生成所有开票月份的年份数组
SEQUENCE(Table2[@[Invoice Months]], 1, 0):生成从0到「发票总月份数-1」的序列,对应发票起始月及后续的每一个月份EDATE(Table2[@[Retro Start Date]], ...):基于起始日期,生成每个开票月份的具体日期YEAR(...):提取每个开票月份的年份,得到完整的年份数组
统计各目标年份的月份数
COUNTIF(年份数组, $V$2#):对表头$V$2#中的每个目标年份,统计其在年份数组中的出现次数,直接返回对应年份的月份数结果数组
示例验证
针对起始日期为2020/5/1、总月份数为35的发票:
- 年份数组包含8个
2020、12个2021、12个2022、3个2023 - 公式返回结果为
[0, 0, 0, 8, 12, 12, 3, 0, 0](对应表头2009、2018-2025的顺序),完全符合需求
替代方案(显式遍历版)
如果偏好显式遍历目标年份,可使用MAP实现:
=LET( start_date, Table2[@[Retro Start Date]], total_months, Table2[@[Invoice Months]], year_list, YEAR(EDATE(start_date, SEQUENCE(total_months, 1, 0))), MAP($V$2#, LAMBDA(target_year, COUNTIF(year_list, target_year))) )
内容的提问来源于stack exchange,提问作者bdpolinsky
相关产品推荐
相关产品推荐

