Visual Basic para Aplicaciones - Function VALORACIÓN TITULO

Life is soft - evento anual de software empresarial
 
Vista:

Function VALORACIÓN TITULO

Publicado por ELD (1 intervención) el 02/05/2019 00:26:29
BUENAS TARDES
NECESITO CON URGENCIA UNA AYUDA!!!!!!!!!!!!!!
ESTOY PROGRAMANDO UNA FUNCIÓN QUE ME VALORE TITULOS DE DEUDA MES VENCIDO, YA QUE LAS FUNCIONES DE EXCEL NO SIRVEN PARA TITULOS MES VENCIDO.
CUANDO CREO LA RUTINA NO TENGO NINGUN PROBLEMA LA RUTINA TIENE EL RESULTA ESPERADO
PERO AL CREAR UNA Function NO LA ESTA CALCULADO ME MUESTRA EL ERROR #¿NOMBRE?

ESTA ES LA RUTINA QUE ESTA CORRECTA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Sub PRECIO_ELD_RUTINA()
Dim PRECIO_ELD, Tasa, Rtdo, Amortización, Base, Residuo As Variant
Dim Fecha_Liquidación As Date
Dim Fecha_Vencimiento As Date
Dim Cupon_Fecha_Anterior_MES As Date
Dim n, j As Integer
 
Tasa = 5.11046319289302
Base = 360
Fecha_Liquidación = "29/04/2019"
Fecha_Vencimiento = "29/11/2020"
Rtdo = 5.355
Amortización = 100
'Calcula Fecha del Cupón anterior
Cupon_Fecha_Anterior_MES = DateSerial(Year(Application.EoMonth(Fecha_Liquidación, -1)), Month(Application.EoMonth(Fecha_Liquidación, -1)), Day(Fecha_Vencimiento))
 
'Cuenta el numero de periodos del titulo para la matriz dinamica que contiene los flujos con todos los calculos
n = DateDiff("M", Cupon_Fecha_Anterior_MES, Fecha_Vencimiento)
 
'Define la matriz dinamica donde se realizaran todos los calculos para llegar al precio sucio
ReDim Matriz_Flujos(n, 6) As Variant
 
'Diligencia encabezados dentro de la matriz Dinamica
Matriz_Flujos(0, 0) = Fecha_Flujos
Matriz_Flujos(0, 1) = Biciestos_VF
Matriz_Flujos(0, 2) = Días_Entre_Flujos
Matriz_Flujos(0, 3) = Cupón
Matriz_Flujos(0, 4) = Biciestos_VPN
Matriz_Flujos(0, 5) = Días_VPN
Matriz_Flujos(0, 6) = VPN
 
'Realiza los calculos dentro de la matriz dinamica
Matriz_Flujos(0, 0) = Cupon_Fecha_Anterior_MES
 
j = 0
For j = 0 To n - 1
    'Columna Fechas
    Matriz_Flujos(j + 1, 0) = DateSerial(Year(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Month(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Day(Fecha_Vencimiento))
    'Culumna Biciestos en VF
    Residuo = Year(Matriz_Flujos(j + 1, 0)) Mod 4
    If Residuo = 0 And Month(Matriz_Flujos(j + 1, 0)) = 2 Then Matriz_Flujos(j + 1, 1) = 1 Else Matriz_Flujos(j + 1, 1) = 0
    'Culumna  Días_Entre_Flujos
    If Base = 360 Then Matriz_Flujos(j + 1, 2) = 30 Else Matriz_Flujos(j + 1, 2) = Matriz_Flujos(j + 1, 0) - Matriz_Flujos(j, 0) - Matriz_Flujos(j + 1, 1)
    'Culumna  Cupón calcula la tasa periodica asumiendo que la tasa es nominal
    If Matriz_Flujos(j + 1, 0) <> Fecha_Vencimiento Then Matriz_Flujos(j + 1, 3) = Tasa / (Base / Matriz_Flujos(j + 1, 2)) Else Matriz_Flujos(j + 1, 3) = (Tasa / (Base / Matriz_Flujos(j + 1, 2))) + Amortización
    'Culumna  Biciestos_VPN
    Matriz_Flujos(1, 4) = Matriz_Flujos(1, 1)
    If Matriz_Flujos(j + 1, 1) = 0 Then Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j, 4) Else Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j + 1, 1) + Matriz_Flujos(j, 4)
    'Culumna  Días_VPN
    Matriz_Flujos(j + 1, 5) = Matriz_Flujos(j + 1, 0) - Fecha_Liquidación - Matriz_Flujos(j + 1, 4)
    'Culumna  VPN
    If Matriz_Flujos(j + 1, 5) <> 0 Then Matriz_Flujos(j + 1, 6) = (Matriz_Flujos(j + 1, 3)) / (1 + (Rtdo / 100)) ^ (Matriz_Flujos(j + 1, 5) / Base) Else Matriz_Flujos(j + 1, 6) = 0
    Precio_Calculado = Matriz_Flujos(j + 1, 6) + Precio_Calculado
Next j
'Resultado
PRECIO_ELD = Precio_Calculado
MsgBox (PRECIO_ELD)
End Sub


PERO AL CREAR LA FUNCIÓN NO MUESTRA RESULTADOS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Function PRECIO_ELD(Fecha_Liquidación As Date, Fecha_Vencimiento As Date, Tasa As Variant, Rtdo As Variant, Amortización As Variant, Base As Variant) As Variant
'Esta Funcion valora un titulo con periodo mes vencido
Dim Cupon_Fecha_Anterior_MES As Date
Dim Residuo, Precio_Calculado As Variant
Dim n, j As Integer
'Calcula Fecha del Cupón anterior
Cupon_Fecha_Anterior_MES = DateSerial(Year(Application.EoMonth(Fecha_Liquidación, -1)), Month(Application.EoMonth(Fecha_Liquidación, -1)), Day(Fecha_Vencimiento))
 
'Cuenta el numero de periodos del titulo para la matriz dinamica que contiene los flujos con todos los calculos
n = DateDiff("M", Cupon_Fecha_Anterior_MES, Fecha_Vencimiento)
 
'Define la matriz dinamica donde se realizaran todos los calculos para llegar al precio sucio
ReDim Matriz_Flujos(n, 6) As Variant
 
'Diligencia encabezados dentro de la matriz Dinamica
Matriz_Flujos(0, 0) = Fecha_Flujos
Matriz_Flujos(0, 1) = Biciestos_VF
Matriz_Flujos(0, 2) = Días_Entre_Flujos
Matriz_Flujos(0, 3) = Cupón
Matriz_Flujos(0, 4) = Biciestos_VPN
Matriz_Flujos(0, 5) = Días_VPN
Matriz_Flujos(0, 6) = VPN
 
'Realiza los calculos dentro de la matriz dinamica
Matriz_Flujos(0, 0) = Cupon_Fecha_Anterior_MES
 
j = 0
For j = 0 To n - 1
    'Columna Fechas
    Matriz_Flujos(j + 1, 0) = DateSerial(Year(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Month(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Day(Fecha_Vencimiento))
    'Culumna Biciestos en VF
    Residuo = Year(Matriz_Flujos(j + 1, 0)) Mod 4
    If Residuo = 0 And Month(Matriz_Flujos(j + 1, 0)) = 2 Then Matriz_Flujos(j + 1, 1) = 1 Else Matriz_Flujos(j + 1, 1) = 0
    'Culumna  Días_Entre_Flujos
    If Base = 360 Then Matriz_Flujos(j + 1, 2) = 30 Else Matriz_Flujos(j + 1, 2) = Matriz_Flujos(j + 1, 0) - Matriz_Flujos(j, 0) - Matriz_Flujos(j + 1, 1)
    'Culumna  Cupón calcula la tasa periodica asumiendo que la tasa es nominal
    If Matriz_Flujos(j + 1, 0) <> Fecha_Vencimiento Then Matriz_Flujos(j + 1, 3) = Tasa / (Base / Matriz_Flujos(j + 1, 2)) Else Matriz_Flujos(j + 1, 3) = (Tasa / (Base / Matriz_Flujos(j + 1, 2))) + Amortización
    'Culumna  Biciestos_VPN
    Matriz_Flujos(1, 4) = Matriz_Flujos(1, 1)
    If Matriz_Flujos(j + 1, 1) = 0 Then Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j, 4) Else Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j + 1, 1) + Matriz_Flujos(j, 4)
    'Culumna  Días_VPN
    Matriz_Flujos(j + 1, 5) = Matriz_Flujos(j + 1, 0) - Fecha_Liquidación - Matriz_Flujos(j + 1, 4)
    'Culumna  VPN
    If Matriz_Flujos(j + 1, 5) <> 0 Then Matriz_Flujos(j + 1, 6) = (Matriz_Flujos(j + 1, 3)) / (1 + (Rtdo / 100)) ^ (Matriz_Flujos(j + 1, 5) / Base) Else Matriz_Flujos(j + 1, 6) = 0
    Precio_Calculado = Matriz_Flujos(j + 1, 6) + Precio_Calculado
Next j
'Resultado
PRECIO_ELD = Precio_Calculado
End Function
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Function VALORACIÓN TITULO

Publicado por Antoni Masana (498 intervenciones) el 02/05/2019 08:29:17
No encuentro una razón para que de error.

La sintaxis es la misma en los dos casos a excepción de los parámetros.

He realizado una prueba y creo que el problema es como pasas los parametros a la función y creo que la fecha la debes estar pasando como texto y no como Date (fecha).

Adjunto Fichero.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Sub PRECIO_ELD_RUTINA()
    Dim PRECIO_ELD, Tasa, Rtdo, Amortización, Base, Residuo As Variant
    Dim Fecha_Liquidación As Date
    Dim Fecha_Vencimiento As Date
    Dim Cupon_Fecha_Anterior_MES As Date
    Dim n, j As Integer
 
    Tasa = 5.11046319289302
    Base = 360
    Fecha_Liquidación = "29/04/2019"
    Fecha_Vencimiento = "29/11/2020"
    Rtdo = 5.355
    Amortización = 100
    ' ---&---  Calcula Fecha del Cupón anterior
    Cupon_Fecha_Anterior_MES = DateSerial(Year(Application.EoMonth(Fecha_Liquidación, -1)), Month(Application.EoMonth(Fecha_Liquidación, -1)), Day(Fecha_Vencimiento))
 
    ' ---&---  Cuenta el numero de periodos del titulo para la matriz dinamica que contiene los flujos con todos los calculos
    n = DateDiff("M", Cupon_Fecha_Anterior_MES, Fecha_Vencimiento)
 
    ' ---&---  Define la matriz dinamica donde se realizaran todos los calculos para llegar al precio sucio
    ReDim Matriz_Flujos(n, 6) As Variant
 
    ' ---&---  Diligencia encabezados dentro de la matriz Dinamica
    Matriz_Flujos(0, 0) = Fecha_Flujos
    Matriz_Flujos(0, 1) = Biciestos_VF
    Matriz_Flujos(0, 2) = Días_Entre_Flujos
    Matriz_Flujos(0, 3) = Cupón
    Matriz_Flujos(0, 4) = Biciestos_VPN
    Matriz_Flujos(0, 5) = Días_VPN
    Matriz_Flujos(0, 6) = VPN
 
    ' ---&---  Realiza los calculos dentro de la matriz dinamica
    Matriz_Flujos(0, 0) = Cupon_Fecha_Anterior_MES
 
    j = 0
    For j = 0 To n - 1
        ' ---&---  Columna Fechas
        Matriz_Flujos(j + 1, 0) = DateSerial(Year(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Month(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Day(Fecha_Vencimiento))
        ' ---&---  Culumna Biciestos en VF
        Residuo = Year(Matriz_Flujos(j + 1, 0)) Mod 4
        If Residuo = 0 And Month(Matriz_Flujos(j + 1, 0)) = 2 Then Matriz_Flujos(j + 1, 1) = 1 Else Matriz_Flujos(j + 1, 1) = 0
        ' ---&---  Culumna Días_Entre_Flujos
        If Base = 360 Then Matriz_Flujos(j + 1, 2) = 30 Else Matriz_Flujos(j + 1, 2) = Matriz_Flujos(j + 1, 0) - Matriz_Flujos(j, 0) - Matriz_Flujos(j + 1, 1)
        ' ---&---  Culumna Cupón calcula la tasa periodica asumiendo que la tasa es nominal
        If Matriz_Flujos(j + 1, 0) <> Fecha_Vencimiento Then Matriz_Flujos(j + 1, 3) = Tasa / (Base / Matriz_Flujos(j + 1, 2)) Else Matriz_Flujos(j + 1, 3) = (Tasa / (Base / Matriz_Flujos(j + 1, 2))) + Amortización
        ' ---&---  Culumna Biciestos_VPN
        Matriz_Flujos(1, 4) = Matriz_Flujos(1, 1)
        If Matriz_Flujos(j + 1, 1) = 0 Then Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j, 4) Else Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j + 1, 1) + Matriz_Flujos(j, 4)
        ' ---&---  Culumna Días_VPN
        Matriz_Flujos(j + 1, 5) = Matriz_Flujos(j + 1, 0) - Fecha_Liquidación - Matriz_Flujos(j + 1, 4)
        ' ---&---  Culumna VPN
        If Matriz_Flujos(j + 1, 5) <> 0 Then Matriz_Flujos(j + 1, 6) = (Matriz_Flujos(j + 1, 3)) / (1 + (Rtdo / 100)) ^ (Matriz_Flujos(j + 1, 5) / Base) Else Matriz_Flujos(j + 1, 6) = 0
        Precio_Calculado = Matriz_Flujos(j + 1, 6) + Precio_Calculado
    Next j
    ' ---&---  Resultado
    PRECIO_ELD = Precio_Calculado
    MsgBox (PRECIO_ELD)
End Sub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Function PRECIO_ELD(Fecha_Liquidación As Date, _
                    Fecha_Vencimiento As Date, _
                    Tasa As Variant, _
                    Rtdo As Variant, _
                    Amortización As Variant,
                    Base As Variant) As Variant
 
    ' ---&---  Esta Funcion valora un titulo con periodo mes vencido
    Dim Cupon_Fecha_Anterior_MES As Date
    Dim Residuo, Precio_Calculado As Variant
    Dim n, j As Integer
    ' ---&---  Calcula Fecha del Cupón anterior
    Cupon_Fecha_Anterior_MES = DateSerial(Year(Application.EoMonth(Fecha_Liquidación, -1)), Month(Application.EoMonth(Fecha_Liquidación, -1)), Day(Fecha_Vencimiento))
 
    ' ---&---  Cuenta el numero de periodos del titulo para la matriz dinamica que contiene los flujos con todos los calculos
    n = DateDiff("M", Cupon_Fecha_Anterior_MES, Fecha_Vencimiento)
 
    ' ---&---  Define la matriz dinamica donde se realizaran todos los calculos para llegar al precio sucio
    ReDim Matriz_Flujos(n, 6) As Variant
 
    ' ---&---  Diligencia encabezados dentro de la matriz Dinamica
    Matriz_Flujos(0, 0) = Fecha_Flujos
    Matriz_Flujos(0, 1) = Biciestos_VF
    Matriz_Flujos(0, 2) = Días_Entre_Flujos
    Matriz_Flujos(0, 3) = Cupón
    Matriz_Flujos(0, 4) = Biciestos_VPN
    Matriz_Flujos(0, 5) = Días_VPN
    Matriz_Flujos(0, 6) = VPN
 
    ' ---&---  Realiza los calculos dentro de la matriz dinamica
    Matriz_Flujos(0, 0) = Cupon_Fecha_Anterior_MES
 
    j = 0
    For j = 0 To n - 1
        ' ---&---  Columna Fechas
        Matriz_Flujos(j + 1, 0) = DateSerial(Year(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Month(Application.EoMonth(Matriz_Flujos(j, 0), 1)), Day(Fecha_Vencimiento))
        ' ---&---  Culumna Biciestos en VF
        Residuo = Year(Matriz_Flujos(j + 1, 0)) Mod 4
        If Residuo = 0 And Month(Matriz_Flujos(j + 1, 0)) = 2 Then Matriz_Flujos(j + 1, 1) = 1 Else Matriz_Flujos(j + 1, 1) = 0
        ' ---&---  Culumna Días_Entre_Flujos
        If Base = 360 Then Matriz_Flujos(j + 1, 2) = 30 Else Matriz_Flujos(j + 1, 2) = Matriz_Flujos(j + 1, 0) - Matriz_Flujos(j, 0) - Matriz_Flujos(j + 1, 1)
        ' ---&---  Culumna Cupón calcula la tasa periodica asumiendo que la tasa es nominal
        If Matriz_Flujos(j + 1, 0) <> Fecha_Vencimiento Then Matriz_Flujos(j + 1, 3) = Tasa / (Base / Matriz_Flujos(j + 1, 2)) Else Matriz_Flujos(j + 1, 3) = (Tasa / (Base / Matriz_Flujos(j + 1, 2))) + Amortización
        ' ---&---  Culumna Biciestos_VPN
        Matriz_Flujos(1, 4) = Matriz_Flujos(1, 1)
        If Matriz_Flujos(j + 1, 1) = 0 Then Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j, 4) Else Matriz_Flujos(j + 1, 4) = Matriz_Flujos(j + 1, 1) + Matriz_Flujos(j, 4)
        ' ---&---  Culumna Días_VPN
        Matriz_Flujos(j + 1, 5) = Matriz_Flujos(j + 1, 0) - Fecha_Liquidación - Matriz_Flujos(j + 1, 4)
        ' ---&---  Culumna VPN
        If Matriz_Flujos(j + 1, 5) <> 0 Then Matriz_Flujos(j + 1, 6) = (Matriz_Flujos(j + 1, 3)) / (1 + (Rtdo / 100)) ^ (Matriz_Flujos(j + 1, 5) / Base) Else Matriz_Flujos(j + 1, 6) = 0
        Precio_Calculado = Matriz_Flujos(j + 1, 6) + Precio_Calculado
    Next j
    ' ---&---  Resultado
    PRECIO_ELD = Precio_Calculado
End Function


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar