Avatar billede contici Nybegynder
23. maj 2010 - 17:21 Der er 5 kommentarer og
1 løsning

Problem med excel funktion i VBA

Jeg har et problem i Excel VBA. Jeg bruger excel funktionen "rente" i VBA. Da VBA er på engelsk, bruger jeg "rate". Funktionen bruges mange gange i koden, som er en stor 3 dobbelt for-løkke. Funktionen virker som den skal, men på et bestemt tidspunkt stopper den, og giver "#Værdi" i Excel. Jeg har tjekket de input værdier der bruges i funktionen når den går ned (vha. debuggeren), og derefter afprøvet rente funktionen i Excel, UDEN problemer.

"Rente" udregner renten på et lån med lige store ydelser. Input er antal perioder, nutidsværdi, ydelse, og evt. et startgæt på renten.

I mit tilfælde er:
ydelse=73,8
nutidsværdi (NV) = 100 (der skal stå -100 i funktionen)
antal perioder = 41
startgæt = 1,6 (=160%)

Hvis dette indtastes i excel:
=RENTE(41;73,8;-100;;;1,6)

Dette giver en rente på 73,8%, hvilket også er helt korrekt, men dette vil den ikke regne ud i VBA.

Jeg har prøvet at lave en lille VBA test-funktion og regnet kun ovenstående rente ud:

Function test()
test=Application.rate(41,73.8,-100,0,0,1.6)
End Function

Ovenstående virker også perfekt! det er kun i den store VBA funktion, den går i ged.

Jeg fandt ud af at startgættet på renten, helst ikke må være ret meget mindre end den korrekte rente, så i den store funktion, er der implementeret at startgættet er forholdsvist højt.

Jeg håber virkelig nogen kan hjælpe. Jeg er totalt tabt, og fatter ikke hvad der sker. Det er til mit speciale omkring prisfastsættelse af konverterbare obligationer, så det skal simpelthen komme til at virke.
Avatar billede supertekst Ekspert
23. maj 2010 - 22:57 #1
Det er nok nødvendigt at se hele VBA-koden.
Avatar billede contici Nybegynder
24. maj 2010 - 08:17 #2
Function NNG_tree(srate_tree, dt, q, rest_loeb, skat_p, kupon, omk, RG0, refispread) 'udregner træ med nettonutidsgevinster. Input renter er INKL. refi spread
'rest_loeb er restløbetiden i år for obligationen på tid 0 (1. april 2010)

Dim tree() As Double
ReDim tree(rest_loeb / dt - 1, rest_loeb / dt - 1, 3)

Dim D() As Double
Dim startguess As Double

For j = 1 To (rest_loeb / dt - 1)
    rest_year = rest_loeb - j * dt
    For i = (rest_loeb / dt - 1) To (rest_loeb / dt - 1 - j) Step -1
       
        ReDim D(rest_loeb / dt - 1 - j)
        D = nk_struktur(srate_tree, j + 1, i + 1, dt, q, refispread, rest_loeb)
        startguess = rente_start_guess(D, rest_loeb / dt - j, dt)
        startguess = (1 + (rest_loeb / dt - rest_year / dt) * (3 / (rest_loeb / dt))) * startguess
       
        Dim ydelse As Double
        Dim kontant_rente_FS As Double
        Dim kontant_rente_ES As Double
        Dim ydelser_ES() As Double
        Dim ydelse_eks As Double
        Dim pv_eks As Double

        ydelse = RG0 / sum(D, 1, rest_year / dt)
       
      kontant_rente_FS = Application.Rate(rest_year / dt, ydelse, -RG0, 0, 0, startguess)

        ydelser_ES = Y_ES(RG0, dt, rest_year, kontant_rente_FS, ydelse, skat_p)

        ydelser_ES(0) = -RG0

        kontant_rente_ES = Application.IRR(ydelser_ES, (1 - skat_p) * kontant_rente_FS)

        ydelse_eks = RG0 * (kupon * dt / (1 - (1 + kupon * dt) ^ (-rest_year / dt)))

        ydelser_eks_ES = Y_ES(RG0, dt, rest_year, kupon * dt, ydelse_eks, skat_p)

        pv_eks = 0
        For m = 1 To rest_year / dt
            pv_eks = pv_eks + ydelser_eks_ES(m) * (1 + kontant_rente_ES) ^ -m
        Next m

        For k = 1 To 3
            tree(i, j, k) = (pv_eks - RG0 - omk(k) * RG0) / pv_eks 'PV(D, RG0, rest_year, dt, skat_p, kupon, omk(k), startguess, rest_loeb)
        Next k
    Next i
Next j

NNG_tree = tree

End Function
___________
Function rente_start_guess(D, l, dt)
Dim y As Double
y = 0
    For i = 1 To l
        y = y + D(i) ^ (-1 / (i * dt)) - 1
    Next i
rente_start_guess = (1 + y / l) ^ dt - 1
End Function
_______________
Function sum(V, t, tt)
Dim s As Double

s = 0

For i = t To tt
    s = s + V(i)
Next i

sum = s

End Function
_____________
Function Y_ES(RG0, dt, t, kont_rente, ydelse, skat_p) 'ydelses profil efter skat

Dim afdrag() As Double
Dim renter() As Double
Dim RGt() As Double
Dim renter_ES() As Double
Dim ydelse_ES() As Double
ReDim afdrag(t / dt)
ReDim renter(t / dt)
ReDim RGt(t / dt)
ReDim renter_ES(t / dt)
ReDim ydelse_ES(t / dt)

RGt(0) = RG0

For i = 1 To (t / dt)
    renter(i) = RGt(i - 1) * kont_rente
    afdrag(i) = ydelse - renter(i)
    RGt(i) = RGt(i - 1) - afdrag(i)
    renter_ES(i) = renter(i) * (1 - skat_p)
    ydelse_ES(i) = renter_ES(i) + afdrag(i)
Next i

Y_ES = ydelse_ES

End Function



Der er markeret med fed, hvor koden går galt. Men det er altså først når j=60 og i=41, så det er ikke bare fordi der er noget galt med linjen, eller "rate" funktionen
Avatar billede contici Nybegynder
24. maj 2010 - 10:02 #3
Jeg har selv løst problemet nu! Det viste sig at for nogle ydelser, ville den ikke udregne renten og gav #num. Hvis man ganger ydelser med fx 1,00000001 og udregner renten igen, så virker det.
Avatar billede supertekst Ekspert
24. maj 2010 - 10:25 #4
Ok..
Avatar billede supertekst Ekspert
26. maj 2010 - 10:00 #5
Husk at lukke tråden..
Avatar billede contici Nybegynder
13. juni 2012 - 08:27 #6
Jeg har selv løst problemet nu! Det viste sig at for nogle ydelser, ville den ikke udregne renten og gav #num. Hvis man ganger ydelser med fx 1,00000001 og udregner renten igen, så virker det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester