如何修改Excel VBA自定义CIRR函数计算储蓄保险IRR?
修改后的VBA IRR函数(适配储蓄保险场景)
原代码的核心问题是没有区分缴费年限和保单年限——它默认领取时间等于缴费结束时间,但实际储蓄保险是缴费期结束后,还要经过若干年才领取。下面是修改后的代码,专门适配你的需求:
Function CIRR(TotalPremiumPaid As Double, PaymentTerm As Integer, PolicyTerm As Integer, FinalValue As Double, Optional Guess As Double = 0.1) As Double ' 参数校验:避免无效输入 If TotalPremiumPaid <= 0 Or PaymentTerm <= 0 Or PolicyTerm <= PaymentTerm Or FinalValue <= 0 Then CIRR = CVErr(xlErrValue) Exit Function End If Dim eachValue As Double eachValue = TotalPremiumPaid / PaymentTerm ' 计算年缴保费 Dim cashFlow() As Double ReDim cashFlow(0 To PolicyTerm) ' 现金流数组覆盖整个保单周期(从第0年到第PolicyTerm年) ' 1. 填充缴费期的现金流(每年投入年缴保费) Dim n As Integer For n = 0 To PaymentTerm - 1 cashFlow(n) = -eachValue Next n ' 2. 填充缴费结束到领取前的现金流(无进出,为0) For n = PaymentTerm To PolicyTerm - 1 cashFlow(n) = 0 Next n ' 3. 填充到期领取的现金流 cashFlow(PolicyTerm) = FinalValue ' 计算IRR,加入默认猜测值(避免IRR函数因初始值问题返回错误) CIRR = IRR(cashFlow, Guess) End Function
关键改动说明
- 新增
PolicyTerm参数:明确区分缴费年限和保单总年限 - 扩展现金流数组:覆盖整个保单周期,中间无现金流的年份填充0
- 增加参数校验:防止负数、缴费年限大于保单年限等无效输入
- 加入可选的
Guess参数:给IRR函数提供默认初始猜测值(10%),减少计算错误概率
使用示例
针对你给出的案例:
- 已缴总保费=50000元
- 缴费年限=5年
- 保单年限=20年
- 到期领取金额=125000元
在Excel单元格中输入公式:
=CIRR(50000,5,20,125000)
计算结果约为4.63%(符合储蓄保险的常规收益区间)
内容的提问来源于stack exchange,提问作者ErnestHub
相关产品推荐
相关产品推荐

