Function PrixObligation(maturityDate As Date, paymentFrequency As Integer, couponRate As Double, _
                        firstCouponDate As Date, valuationDate As Date, discountCurve As Range, _
                        dayCountConvention As String) As Double

    Dim daysToMaturity As Integer
    Dim couponPayment As Double
    Dim discountFactor As Double
    Dim timeToPayment As Double
    Dim discountRate As Double
	Dim timeToMaturity As Double
    Dim i As Integer
    Dim daysInYear As Integer
    
    'Détermination du nombre de jours dans une année en fonction de la convention de base
    Select Case dayCountConvention
        Case "AA"
            daysInYear = 365
        Case "A5"
            daysInYear = 365
        Case "A0"
            daysInYear = 360
        Case Else
            ' Par défaut, utilisation de 365 jours
            daysInYear = 365
    End Select

    ' Calcul du nombre de jours jusqu'à la maturité
    daysToMaturity = maturityDate - valuationDate
	
	'Calcul du temps avant maturité pour connaitre le nombre des coupons
	timeToMaturity = daysToMaturity/daysInYear

    ' Calcul du montant de chaque paiement de coupon
    couponPayment = couponRate / paymentFrequency

    ' Initialisation du prix de l'obligation
    PrixObligation = 0

    ' Calcul du prix de l'obligation en sommant les flux actualisés
    On Error Resume Next ' Ignorer les erreurs potentielles dans la fonction InterpLineaire
    For i = 1 To timeToMaturity * paymentFrequency
        ' Calcul du temps jusqu'au paiement du coupon
        timeToPayment = (firstCouponDate - valuationDate) + (i - 1) * (daysInYear / paymentFrequency)

        ' Interpolation linéaire pour obtenir le taux de remise correspondant
        discountRate = InterpLineaire(discountCurve, timeToPayment)

        If Err.Number <> 0 Then Exit Function ' Quitter la fonction si une erreur s'est produite

        ' Calcul du facteur d'actualisation
        discountFactor = Exp(-discountRate * timeToPayment / daysInYear)

        ' Ajout du flux actualisé au prix de l'obligation
        PrixObligation = PrixObligation + couponPayment * discountFactor
    Next i
    On Error GoTo 0 ' Réactiver la gestion des erreurs normale

    ' Ajout du remboursement du principal à l'échéance
    PrixObligation = PrixObligation + 1 * Exp(-discountRate * daysToMaturity / daysInYear)

End Function

Function InterpLineaire(discountCurve As Range, timeToPayment As Double) As Double
    Dim i As Integer
    Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double

    On Error GoTo ErrorHandler ' Gestion des erreurs pour éviter tout arrêt inattendu

    ' Recherche des points de la courbe les plus proches
    For i = 1 To discountCurve.Rows.Count - 1
        If discountCurve.Cells(i, 1).Value <= timeToPayment And discountCurve.Cells(i + 1, 1).Value >= timeToPayment Then
            x1 = discountCurve.Cells(i, 1).Value
            x2 = discountCurve.Cells(i + 1, 1).Value
            y1 = discountCurve.Cells(i, 2).Value
            y2 = discountCurve.Cells(i + 1, 2).Value
            Exit For
        End If
    Next i

    ' Interpolation linéaire
    InterpLineaire = y1 + (timeToPayment - x1) * (y2 - y1) / (x2 - x1)

    Exit Function ' Sortir de la fonction après l'interpolation linéaire

ErrorHandler:
    InterpLineaire = 0 ' Retourner 0 en cas d'erreur
End Function


