¿Cómo hago para queApplication.WorksheetFunction.Xirr, me coja bien los vectores de flujos y fechas?
El código es el siguiente y el problema es en el case "YIELD". Estamos haciéndolo bajo funciones, y es utilizado para calcular la yield o tir.no.per de un bono. A ver si me pueden colaborar.
Cuando evalúo la función hasta Application.WorksheetFunction.Xirr, Me dice que los vectores vecFVSorted (vector que posee los flujos, los cuales ya están bien) y vecMatSorted (vector que posee cada una de las fechas correspondientes a cada flujo), están vacíos, y con los contadores yo veo que se están llenando. El resultado final en la celda en la cual evalúo la función insertándole cada uno de los valores que me pide, es #Valor.
Dim vecFV(), vecTenor(), vecDisc(), vecNPV(), vecMat() As Date, vecPV01()
ReDim vecFV(TotalPeriods), vecTenor(TotalPeriods), vecDisc(TotalPeriods), vecNPV(TotalPeriods), vecMat(TotalPeriods), vecPV01(TotalPeriods)
Mat = Maturity
FV = 1 + BondInterest
For por = 1 To TotalPeriods
vecMat(por) = Mat
vecTenor(por) = vecMat(por) - ValuationDate
vecFV(por) = FV
vecDisc(por) = 1 / ((1 + Yield) ^ (vecTenor(por) / 365))
vecNPV(por) = vecFV(por) * vecDisc(por)
vecPV01(por) = vecFV(por) * (1 / ((1 + Yield + PV01Shift) ^ (vecTenor(por) / 365))) - vecNPV(por)
Mat = DateSerial(Year(vecMat(por)) - shiftYear, Month(vecMat(por)) - shiftMonth, Day(vecMat(por)) - shiftDay)
FV = BondInterest
Next por
DP = WorksheetFunction.Sum(vecNPV) * Multiplier
Select Case UCase(OutputType)
Case "DIRTY"
Pricing = DP
Case "CLEAN"
AccruedPeriod = ValuationDate - Mat
PriceAdj = ((1 + BondInterest) ^ (AccruedPeriod / 365) - 1) * -1
Pricing = DP + PriceAdj * Multiplier
Case "DURATION"
Pricing = WorksheetFunction.SumProduct(vecTenor, vecNPV) / WorksheetFunction.Sum(vecNPV)
Case "PV01"
Pricing = WorksheetFunction.Sum(vecPV01)
Case "YIELD"
Dim vecFVSorted() As Double, vecMatSorted() As Date
ReDim vecFVSorted(UBound(vecFV))
ReDim vecMatSorted(UBound(vecMat))
Dim l() As Double
Dim z() As Date
Dim a As Variant
Dim b As Variant
vecFVSorted(0) = -DirtyPrice / 100
vecMatSorted(0) = ValuationDate
For i = 1 To UBound(vecFV)
vecFVSorted(i) = vecFV(UBound(vecFV) - i + 1)
vecMatSorted(i) = vecMat(UBound(vecMat) - i + 1)
'l = vecFVSorted(i)
'z = vecMatSorted(i)
Next i
ReDim l(0 To UBound(vecFV))
ReDim z(0 To UBound(vecMat))
'For i = 0 To UBound(vecFVSorted)
' Debug.Print "por" & vecFVSorted(i) & "por"
'Neport i
'
'For i = 0 To UBound(vecMatSorted)
' Debug.Print "por" & vecMatSorted(i) & "por"
'Neport i
Pricing = WorksheetFunction.Xirr(l, z)
'Debug.Print "zzz" & Pricing & "zzz"
Case Else
Pricing = "OutputType not defined"
End Select