债券投资组合的息票支付日期 - 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#.

形式的日期文字

即使对于每月最后一天的到期日,上述代码也能正常工作。如果您想将代码更改为更灵活,以便您可以指定两张优惠券之间的 ,您还必须考虑适当的天数约定,这使得很多比较复杂。