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:
powrót na stronę główną
RSS