VB und die XIRR-Methode

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Narretei.

    VB und die XIRR-Methode

    Hallo Zusammen,

    ich habe ein kleines Problem in VB und hoffe, dass ihr mir dabei helfen könnt.
    Ich würde gerne den IRR von einem bestimmten Zeitraum errechnen lassen und wollte dazu die Excel-Funktion "XIRR()" nutzen.

    Hier mein Code:

    VB.NET-Quellcode

    1. Dim cXLS As Excel.Application
    2. Dim valArr(2) As Double
    3. Dim datArr(2) As Double
    4. Dim val As Double = 10
    5. Dim res As Double
    6. valArr(0) = -10000
    7. valArr(1) = 500
    8. valArr(2) = 500
    9. datArr(0) = New DateTime(2016, 1, 1).ToOADate
    10. datArr(1) = New DateTime(2016, 2, 1).ToOADate
    11. datArr(2) = New DateTime(2017, 1, 1).ToOADate
    12. Try
    13. cXLS = New Excel.Application
    14. res = cXLS.WorksheetFunction.Average(1, 3) '=> Funktioniert ohne Probleme und gibt 2 zurück
    15. res = cXLS.WorksheetFunction.Xirr(valArr, datArr, val)
    16. MsgBox(res)
    17. Catch ex As Exception
    18. MsgBox(ex.Message)
    19. End Try


    Mein Problem ist nun, dass die Funktion XIRR nicht funktioniert.
    Ich erhalte die Fehlermeldung: "Die Xirr-Methode des WorksheetFunction-Objektes konnte nicht ausgeführt werden." mit dem ErrorCode: -2146827284

    Die "Average"-Funktion hingegen funktioniert ohne Probleme.

    Das ".ToOADate" habe ich genutzt, weil in einer Doku stand, dass das DateTime Format bei externen Programmen Probleme verursachen kann.

    Kann mir hier bitte jemand weiterhelfen? Ich komme zurzeit zur keiner Lösung.

    Vielen Dank schonmal!
    Welche Excel Version nutzt du?
    Hast du XIRR in Excel als Funktion zur Verfügung?

    Edit: Welche Sprache ist dein Excel? Wenn ich das richtig sehe ich XIRR in deutsch xintzinsfuss
    Nochmal: Hinweis von MS:
    ​Hinweis: Wenn die XIRR()-Funktion nicht verfügbar ist, installieren das Analyse-Funktionen-add-in.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Ja, sorry. Habe ich vergessen zu erwähnen. :whistling:

    Ich nutze die deutsche Version von Excel 2013.
    Du hast natürlich recht. die XIRR Funktion gibt es in Excel (deutsch) nicht. Die heißt "xintzinsfuss" und die funktioniert in Excel auch.

    Über die DLL erreiche ich aber nur die XIRR-Funktion. Da gibt es den deutschen Funktionsnamen nicht. Allerdings müsste die zugrunde liegende Funktion identisch sein.
    Ich habe es jetzt hinbekommen...

    Der Code dazu:

    VB.NET-Quellcode

    1. Dim cXLS As Excel.Application
    2. Dim valArr(2) As Object
    3. Dim datArr(2) As Double
    4. Dim val As Double = 0.1
    5. Dim res As Double
    6. valArr(0) = -1000
    7. valArr(1) = 700
    8. valArr(2) = 700
    9. datArr(0) = New DateTime(2016, 1, 1).ToOADate
    10. datArr(1) = New DateTime(2016, 2, 1).ToOADate
    11. datArr(2) = New DateTime(2017, 1, 1).ToOADate
    12. Try
    13. cXLS = New Excel.Application
    14. res = cXLS.WorksheetFunction.Xirr(valArr, datArr, val)
    15. MsgBox(res)
    16. Catch ex As Exception
    17. MsgBox(ex.Message)
    18. End Try
    hier mal Hilfe zur Selbsthilfe, wenn nicht unbedingt zwingend die XIRR-Funktion von Excel benutzt werden muss:
    Google-Suchbegriff: "Excel xirr .net"
    Stackoverflow: stackoverflow.com/questions/5179866/xirr-calculation

    Code(ungetestet, weil keine Ahnung. Übersetzt in VB.net):

    VB.NET-Quellcode

    1. Class xirr
    2. Public Const tol As Double = 0.001
    3. Public Delegate Function fx(ByVal x As Double) As Double
    4. Public Shared Function composeFunctions(ByVal f1 As fx, ByVal f2 As fx) As fx
    5. Return Function(ByVal x As Double) f1(x) + f2(x)
    6. End Function
    7. Public Shared Function f_xirr(ByVal p As Double, ByVal dt As Double, ByVal dt0 As Double) As fx
    8. Return Function(ByVal x As Double) p * Math.Pow((1.0 + x), ((dt0 - dt) / 365.0))
    9. End Function
    10. Public Shared Function df_xirr(ByVal p As Double, ByVal dt As Double, ByVal dt0 As Double) As fx
    11. Return Function(ByVal x As Double) (1.0 / 365.0) * (dt0 - dt) * p * Math.Pow((x + 1.0), (((dt0 - dt) / 365.0) - 1.0))
    12. End Function
    13. Public Shared Function total_f_xirr(ByVal payments As Double(), ByVal days As Double()) As fx
    14. Dim resf As fx = Function(ByVal x As Double) 0.0
    15. For i As Integer = 0 To payments.Length - 1
    16. resf = composeFunctions(resf, f_xirr(payments(i), days(i), days(0)))
    17. Next
    18. Return resf
    19. End Function
    20. Public Shared Function total_df_xirr(ByVal payments As Double(), ByVal days As Double()) As fx
    21. Dim resf As fx = Function(ByVal x As Double) 0.0
    22. For i As Integer = 0 To payments.Length - 1
    23. resf = composeFunctions(resf, df_xirr(payments(i), days(i), days(0)))
    24. Next
    25. Return resf
    26. End Function
    27. Public Shared Function Newtons_method(ByVal guess As Double, ByVal f As fx, ByVal df As fx) As Double
    28. Dim x0 As Double = guess
    29. Dim x1 As Double = 0.0
    30. Dim err As Double = 1e+100
    31. While err > tol
    32. x1 = x0 - f(x0) / df(x0)
    33. err = Math.Abs(x1 - x0)
    34. x0 = x1
    35. End While
    36. Return x0
    37. End Function
    38. Public Shared Sub Main(ByVal args As String())
    39. Dim payments As Double() = {-6800, 1000, 2000, 4000}
    40. Dim days As Double() = {01, 08, 16, 25}
    41. Dim xirr As Double = Newtons_method(0.1, total_f_xirr(payments, days), total_df_xirr(payments, days))
    42. Console.WriteLine("XIRR value is {0}", xirr)
    43. End Sub
    44. End Class