债券投资组合的息票支付日期 - Excel
Dates of coupon payments of a bond's portfolio - Excel
我对 excel-vba 有点新手,但我正在尝试构建一个函数,为我提供债券息票支付的日期。
举个简单的例子,我有这两个债券:
标称值:100;300
息票率:0,06; 0,05
CPN_Freq:
4;
2
月数:
3; 6
结算:
01-11-2001;
01-11-2001
成熟度:
15-12-2003;
15-05-2005
基础:0;1
我想要的是每张债券的息票支付日期,第一个是:
15-12-2003 15-09-2003 15-06-2003 15-03-2003 15-12-2002 15-09-2002 15-06-2002 15-03-2002 15-12-2001 01-11-2001(每个在一个单元格中)
我制作了这段代码,但没有用。
Function CouponDate( Maturity As Date, Settlement As Date, Months
As Date)
For i= Maturity - Months
If Maturity - Months > Settlement
CouponDate = i - Months
Else
CouponDate= Settlement
End if
End Function
你能帮我个忙吗?谢谢:)
您不能使用函数,因为您有多个 return 值。
您可以使用 Sub(没有 return 值),然后将 return 值直接写入所需的单元格。这就是附加参数 FirstOutputCell
的用途:它定义了应该写入的第一个单元格。
Public Sub CouponDate(Maturity As Date, Settlement As Date, Months As Long, ByRef FirstOutputCell As Range)
Dim i As Long
Dim CouponDate As Date
i = 0
Do
CouponDate = DateAdd("m", -i * Months, Maturity)
If CouponDate <= Settlement Then
CouponDate = Settlement
End If
FirstOutputCell.Offset(i, 0) = CouponDate
i = i + 1
Loop While CouponDate > Settlement
End Sub
如果您在单元格 B1、B2 和 B3 中分别有到期日、结算日和月份,则调用 CouponDate Range("B1"), Range("B2"), Range("B3"), Range("B4")
将在单元格 B4 到 B7 中填入息票日期(如果您不希望列中的输出行简单切换 Offset()
函数的参数)。
当然也可以直接指定参数调用函数:CouponDate #5/30/2003#, #11/1/2001#, 3, Range("B4")
确保前两个参数的类型为Date
。传递字符串 "15-12-2003"
可能有效,具体取决于为 OS 设置的语言环境。更好的方法是使用格式为日期的 Excel 单元格,或者 - 如上所示 - #m/d/yyyy#
.
形式的日期文字
即使对于每月最后一天的到期日,上述代码也能正常工作。如果您想将代码更改为更灵活,以便您可以指定两张优惠券之间的 天 ,您还必须考虑适当的天数约定,这使得很多比较复杂。
我对 excel-vba 有点新手,但我正在尝试构建一个函数,为我提供债券息票支付的日期。
举个简单的例子,我有这两个债券:
标称值:100;300
息票率:0,06; 0,05
CPN_Freq: 4; 2
月数: 3; 6
结算: 01-11-2001; 01-11-2001
成熟度: 15-12-2003; 15-05-2005
基础:0;1
我想要的是每张债券的息票支付日期,第一个是:
15-12-2003 15-09-2003 15-06-2003 15-03-2003 15-12-2002 15-09-2002 15-06-2002 15-03-2002 15-12-2001 01-11-2001(每个在一个单元格中)
我制作了这段代码,但没有用。
Function CouponDate( Maturity As Date, Settlement As Date, Months
As Date)
For i= Maturity - Months
If Maturity - Months > Settlement
CouponDate = i - Months
Else
CouponDate= Settlement
End if
End Function
你能帮我个忙吗?谢谢:)
您不能使用函数,因为您有多个 return 值。
您可以使用 Sub(没有 return 值),然后将 return 值直接写入所需的单元格。这就是附加参数 FirstOutputCell
的用途:它定义了应该写入的第一个单元格。
Public Sub CouponDate(Maturity As Date, Settlement As Date, Months As Long, ByRef FirstOutputCell As Range)
Dim i As Long
Dim CouponDate As Date
i = 0
Do
CouponDate = DateAdd("m", -i * Months, Maturity)
If CouponDate <= Settlement Then
CouponDate = Settlement
End If
FirstOutputCell.Offset(i, 0) = CouponDate
i = i + 1
Loop While CouponDate > Settlement
End Sub
如果您在单元格 B1、B2 和 B3 中分别有到期日、结算日和月份,则调用 CouponDate Range("B1"), Range("B2"), Range("B3"), Range("B4")
将在单元格 B4 到 B7 中填入息票日期(如果您不希望列中的输出行简单切换 Offset()
函数的参数)。
当然也可以直接指定参数调用函数:CouponDate #5/30/2003#, #11/1/2001#, 3, Range("B4")
确保前两个参数的类型为Date
。传递字符串 "15-12-2003"
可能有效,具体取决于为 OS 设置的语言环境。更好的方法是使用格式为日期的 Excel 单元格,或者 - 如上所示 - #m/d/yyyy#
.
即使对于每月最后一天的到期日,上述代码也能正常工作。如果您想将代码更改为更灵活,以便您可以指定两张优惠券之间的 天 ,您还必须考虑适当的天数约定,这使得很多比较复杂。