23. maj 2010 - 17:21Der 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.
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
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
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
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.
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.
Synes godt om
Ny brugerNybegynder
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.