2012.01.22 12:30 jak w VBA w Excelu policzyć różne wartości IRR, kiedy w danym przypadku IRR przyjmuje kilka wartości

Kiedy przepływ pieniędzy zmienia kierunek kilkakrotnie, IRR ( http://en.wikipedia.org/wiki/Internal_rate_of_return ) przyjmuje kilka wartości. A funkcja IRR, która jest w Excelu, liczy tylko jedną wartość. Oto trzy wiązane sznurkiem funkcje napisane w VBA (UDF) pozwalające znaleźć wszystkie wartości IRR.
Funkcja ile_irr przyjmuje w parametrze zakres zawierający przepływy, a zwraca liczbę mówiącą, ile różnych wartości przyjmuje IRR dla tych przepływów. Funkcja kolejny_irr przyjmuje dwa parametry: zakres zawierający przepływy oraz liczbę mówiącą, którą z wartości chcemy dostać; zwraca ona tę wartość, o którą poprosiliśmy. Funkcja wszystkie_irr przyjmuje w parametrze zakres zawierający przepływy, a zwraca napis (zwykły napis) zawierający wszystkie znalezione wartości IRR.
Wszystkie funkcje są public domain.
Można je przetestować na przykład na takich przepływach pieniędzy:
-100
2000
0
0
0
0
0
0
0
0
-2100

Option Explicit

Function ile_irr(przeplywy As Range) As Integer

Dim ile As Integer
Dim ostatni As Double
Dim i As Double
Dim wynik As Double

ile = 0
ostatni = 999999999
wynik = ostatni
For i = -1 To 10 Step 0.01
    On Error Resume Next
    wynik = WorksheetFunction.irr(przeplywy, i)
    If Abs(wynik - ostatni) > 0.0001 Then
        ile = ile + 1
        ostatni = wynik
    End If
Next i
ile_irr = ile

End Function

Function kolejny_irr(przeplywy As Range, ktory_dac As Integer) As Double

Dim ktory As Integer
Dim ostatni As Double
Dim i As Double
Dim wynik_aktualny As Double
Dim wynik_ostateczny As Double

ktory = 0
ostatni = 999999999
wynik_aktualny = ostatni
wynik_ostateczny = ostatni
For i = -1 To 10 Step 0.01
    On Error Resume Next
    wynik_aktualny = WorksheetFunction.irr(przeplywy, i)
    If Abs(wynik_aktualny - ostatni) > 0.0001 Then
        ktory = ktory + 1
        ostatni = wynik_aktualny
        If ktory = ktory_dac Then
            wynik_ostateczny = wynik_aktualny
            Exit For
        End If
    End If
Next i
kolejny_irr = wynik_ostateczny

End Function

Function wszystkie_irr(przeplywy As Range) As String

Dim ostatni As Double
Dim i As Double
Dim wynik As Double
wszystkie_irr = ""

ostatni = 999999999
wynik = ostatni
For i = -1 To 10 Step 0.01
    On Error Resume Next
    wynik = WorksheetFunction.irr(przeplywy, i)
    If Abs(wynik - ostatni) > 0.0001 Then
        ostatni = wynik
        If wszystkie_irr <> "" Then
            wszystkie_irr = wszystkie_irr & ", "
        End If
        wszystkie_irr = wszystkie_irr & WorksheetFunction.Text(wynik, "0.00%")
    End If
Next i

End Function






komentarze:

ksywa:

tu wpisz cyfrę cztery: (to takie zabezpieczenie antyspamowe)

komentarze wulgarne albo co mi się nie spodobają będę kasował


powrot na strone glowna

RSS