Excel 根据日期范围内的支出天数拆分每年金额的公式
Excel formula to split an amount per year depending on expenditure days within a date range
我正在构建一个公式,根据 2021 年到 2031 年之间变化的开始和结束支出期来拆分总成本(在 J 列中)。基于支出期日期之间的天数(列M),我设法使用以下公式将成本分摊到 2023 年,但它不一致,有时不正确。
在单元格 P5 中,我有以下公式。对于 2021 年,我似乎得到了正确的拆分结果。
=IF($K5>AS5,0,$J5/$M5*(AS5-$K5))
在单元格 Q5 中,我有以下公式。对于 2022 年,我似乎也得到了正确的吐口水
=MIN(IF(SUM($N5:P5)>=$J5,0,IF($L5>=AS5,$J5/$M5*(AS5-AR5),$J5/$M5*($L5-MAX (AR5,$K5)))),K5)
但是,我在公式相同但日期不同的单元格 Q6 中没有得到正确的结果
=MIN(IF(SUM($N6:P6)>=$J6,0,IF($L6>=AS6,$J6/$M6*(AS6-AR6),$J6/$M6*($L6-MAX (AR6,$K6)))),K6)
单元格 R6 不应 return 任何结果,因为它已超出日期范围。这就是事情变得混乱的地方。
请注意,从 AR 到 BC 列,它是从 2020 年到 2031 年的所有年末日期,如下所示。
有没有更好的方法来解决这种公式,因为我似乎被拖入了一个漫长而不可靠的方法。
Here 单个函数 (♣) 将为任何给定的 start/end 日期创建一系列 pro-rata 乘数(适当长度):
编辑: 根据对原始解决方案的 OP 评论查看扩展版本的解决方案结尾...
单一功能
=J11*(LET(dates,EDATE(DATE(YEAR($K11),1,1),12*(SEQUENCE(1,YEAR($L11)-YEAR($K11)+2,1))),IF(dates<K11,K11,IF(dates<L11,dates,L11)))-LET(dates,EDATE(DATE(YEAR($K11)-1,1,1),12*(SEQUENCE(1,YEAR($L11)-YEAR($K11)+2,1))),IF(dates<K11,K11,IF(dates<L11,dates,L11))))/(L11-K11)
它的长度可能显得有些笨拙,但与您创建的 steps/series 的组合相比,它更加健壮(和简洁)。更重要的是,它 returns 精确的答案 RE:pro-rata 付款并且保证永远不会 over/under-run RE:总付款(按设计)。
BREAK-DOWN
包含 3 个不同的部分(其中一些在 pattern/formation 中相似):
1] 第一部分 - 创建跨越 start-end 日期的系列(数组):
=LET(dates,EDATE(DATE(YEAR($K5)-1,1,1),12*(SEQUENCE(1,YEAR($L5)-YEAR($K5)+2,1))),IF(dates<K5,K5,IF(dates<L5,dates,L5)))
多亏了可爱的 Spill 功能,新的 Office 365 变体 Excel 引以为傲,您永远不必担心需要多少年 - 只要您在本工作簿的右侧有 space(否则会很不寻常 - 假设您从 O 列开始并清除其右侧的任何内容,您需要一个超过 2557 年(26 世纪)的结束日期达到 运行 列!☺
2] 第二部分 只是第一个系列的复制品,尽管向右移动 'once' (因此从第一个系列的第二个元素开始) :
=LET(dates,EDATE(DATE(YEAR($K5),1,1),12*(SEQUENCE(1,YEAR($L5)-YEAR($K5)+2,1))),IF(dates<K5,K5,IF(dates<L5,dates,L5)))
3] 第三部分 - 你拥有第 1 部分和第 2 部分的基本要素,可以轻松完成所需的任务:只需从 1 中减去系列 2(给出连续日期之间的天数)系列 1 - 即开始日期和结束日期之间每年的天数),除以总天数(产生 pro-rata 乘数),然后将这些乘以总金额和 voila - 你有你的系列!
=J5*(O6#-O5#)/(M5)
♣ 警告 - 假设您有 Excel 的 Office 365 兼容版本(现在很常见)
*编辑 - 扩展版本
鉴于以上,以下 扩展 这以在各自的 日历周期内调整货币结果(第一个 table、o11:w21) 列(跨越整个有问题的时期)。
这个解决方案:
- 根据列数和相应的日历周期(从 1/1 开始的财政年度)确定 header 行作为数组函数(即动态范围)
- 利用方程式的修改版本。提供日期安排(参考:“第一部分”,原方案)
评论 - 与以前相同的注意事项 - 即 Office 365 等
截图/here 参考:
DATES (HEADER) - Y10(数组)
=LET(y_,MIN(K11:K21),x_,MAX(L11:L21),EDATE(DATE(YEAR(y_)-1,1,1),12*(SEQUENCE(1,YEAR(x_)-YEAR(y_)+2,1))))
评论 - 在单个单元格 Y10 中输入一次 - 即作为数组函数,向右溢出
ALIGNED/SHIFTED 财务 - Y11:Y21(col 中的每个单元格是一个数组)
=IFERROR(IF(Y#<EDATE(K11,-12),"",IF(Y#>EDATE(L11,12),"",INDEX(O11#,1,MATCH(Y#,EDATE(DATE(YEAR($K11)-1,1,1),12*(SEQUENCE(1,YEAR($L11)-YEAR($K11)+2,1))),0)))),"")
评论 - 将其作为数组 fn 输入。 (#SPILL!向右)在 Y 列的每个单元格中(可以根据需要向下拖动此功能 Y11:Y21)
我正在构建一个公式,根据 2021 年到 2031 年之间变化的开始和结束支出期来拆分总成本(在 J 列中)。基于支出期日期之间的天数(列M),我设法使用以下公式将成本分摊到 2023 年,但它不一致,有时不正确。
在单元格 P5 中,我有以下公式。对于 2021 年,我似乎得到了正确的拆分结果。 =IF($K5>AS5,0,$J5/$M5*(AS5-$K5))
在单元格 Q5 中,我有以下公式。对于 2022 年,我似乎也得到了正确的吐口水 =MIN(IF(SUM($N5:P5)>=$J5,0,IF($L5>=AS5,$J5/$M5*(AS5-AR5),$J5/$M5*($L5-MAX (AR5,$K5)))),K5)
但是,我在公式相同但日期不同的单元格 Q6 中没有得到正确的结果 =MIN(IF(SUM($N6:P6)>=$J6,0,IF($L6>=AS6,$J6/$M6*(AS6-AR6),$J6/$M6*($L6-MAX (AR6,$K6)))),K6)
单元格 R6 不应 return 任何结果,因为它已超出日期范围。这就是事情变得混乱的地方。
请注意,从 AR 到 BC 列,它是从 2020 年到 2031 年的所有年末日期,如下所示。
有没有更好的方法来解决这种公式,因为我似乎被拖入了一个漫长而不可靠的方法。
Here 单个函数 (♣) 将为任何给定的 start/end 日期创建一系列 pro-rata 乘数(适当长度):
编辑: 根据对原始解决方案的 OP 评论查看扩展版本的解决方案结尾...
单一功能
=J11*(LET(dates,EDATE(DATE(YEAR($K11),1,1),12*(SEQUENCE(1,YEAR($L11)-YEAR($K11)+2,1))),IF(dates<K11,K11,IF(dates<L11,dates,L11)))-LET(dates,EDATE(DATE(YEAR($K11)-1,1,1),12*(SEQUENCE(1,YEAR($L11)-YEAR($K11)+2,1))),IF(dates<K11,K11,IF(dates<L11,dates,L11))))/(L11-K11)
它的长度可能显得有些笨拙,但与您创建的 steps/series 的组合相比,它更加健壮(和简洁)。更重要的是,它 returns 精确的答案 RE:pro-rata 付款并且保证永远不会 over/under-run RE:总付款(按设计)。
BREAK-DOWN
包含 3 个不同的部分(其中一些在 pattern/formation 中相似):
1] 第一部分 - 创建跨越 start-end 日期的系列(数组):
=LET(dates,EDATE(DATE(YEAR($K5)-1,1,1),12*(SEQUENCE(1,YEAR($L5)-YEAR($K5)+2,1))),IF(dates<K5,K5,IF(dates<L5,dates,L5)))
多亏了可爱的 Spill 功能,新的 Office 365 变体 Excel 引以为傲,您永远不必担心需要多少年 - 只要您在本工作簿的右侧有 space(否则会很不寻常 - 假设您从 O 列开始并清除其右侧的任何内容,您需要一个超过 2557 年(26 世纪)的结束日期达到 运行 列!☺
2] 第二部分 只是第一个系列的复制品,尽管向右移动 'once' (因此从第一个系列的第二个元素开始) :
=LET(dates,EDATE(DATE(YEAR($K5),1,1),12*(SEQUENCE(1,YEAR($L5)-YEAR($K5)+2,1))),IF(dates<K5,K5,IF(dates<L5,dates,L5)))
3] 第三部分 - 你拥有第 1 部分和第 2 部分的基本要素,可以轻松完成所需的任务:只需从 1 中减去系列 2(给出连续日期之间的天数)系列 1 - 即开始日期和结束日期之间每年的天数),除以总天数(产生 pro-rata 乘数),然后将这些乘以总金额和 voila - 你有你的系列!
=J5*(O6#-O5#)/(M5)
♣ 警告 - 假设您有 Excel 的 Office 365 兼容版本(现在很常见)
*编辑 - 扩展版本
鉴于以上,以下 扩展 这以在各自的 日历周期内调整货币结果(第一个 table、o11:w21) 列(跨越整个有问题的时期)。
这个解决方案:
- 根据列数和相应的日历周期(从 1/1 开始的财政年度)确定 header 行作为数组函数(即动态范围)
- 利用方程式的修改版本。提供日期安排(参考:“第一部分”,原方案)
评论 - 与以前相同的注意事项 - 即 Office 365 等
截图/here 参考:
DATES (HEADER) - Y10(数组)
=LET(y_,MIN(K11:K21),x_,MAX(L11:L21),EDATE(DATE(YEAR(y_)-1,1,1),12*(SEQUENCE(1,YEAR(x_)-YEAR(y_)+2,1))))
评论 - 在单个单元格 Y10 中输入一次 - 即作为数组函数,向右溢出
ALIGNED/SHIFTED 财务 - Y11:Y21(col 中的每个单元格是一个数组)
=IFERROR(IF(Y#<EDATE(K11,-12),"",IF(Y#>EDATE(L11,12),"",INDEX(O11#,1,MATCH(Y#,EDATE(DATE(YEAR($K11)-1,1,1),12*(SEQUENCE(1,YEAR($L11)-YEAR($K11)+2,1))),0)))),"")
评论 - 将其作为数组 fn 输入。 (#SPILL!向右)在 Y 列的每个单元格中(可以根据需要向下拖动此功能 Y11:Y21)