Attribute VB_Name = "mGWerte"

Dim cache As Object



Sub InitializeCache()

    ' Erstelle ein neues Dictionary-Objekt

    Set cache = CreateObject("Scripting.Dictionary")

End Sub





Public Function Act_qx(Alter As Integer, Sex As String, Tafel As String, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   Dim ws As Worksheet

   Dim sTafelvektor As String

    

    Set ws = ThisWorkbook.Worksheets("Tafeln")

    If UCase(Sex) <> "M" Then Sex = "F"

    
MAX_ALTER
   Select Case UCase(Tafel)    ' Prüfen, ob Tafelstring überhaupt implementiert ist

        ' hier muss die komplette Liste aller implementierten Tafeln angegeben werden

      Case "DAV1994_T", "DAV2008_T"
MAX_ALTER
               sTafelvektor = UCase(Tafel) & "_" & Sex

               Act_qx = WorksheetFunction.Index(ws.Range("m_Tafeln"), Alter + 1, WorksheetFunction.Match(sTafelvektor, ws.Range("v_Tafeln"), 0))

      Case Else

         Act_qx = 1#

         Error (1)

   End Select



End Function





Private Function v_lx(Endalter As Integer, Sex As String, Tafel As String, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Variant

   ' erzeugt Vektor der lx

   ' falls Endalter = -1 dann wird bis max_Alter erzeugt

   Dim vek() As Variant

   Dim i As Integer

   Dim Grenze As Integer
MAX_ALTER


   If Endalter = -1 Then

      Grenze = max_Alter

   Else

      Grenze = Endalter

   End If



   ReDim vek(Grenze)



   vek(0) = 1000000

   For i = 1 To Grenze

      vek(i) = vek(i - 1) * (1 - Act_qx(i - 1, Sex, Tafel, GebJahr, Rentenbeginnalter, Schicht))

      vek(i) = WorksheetFunction.Round(vek(i), rund_lx)

   Next i

   v_lx = vek()
MAX_ALTER
End Function



Public Function Act_lx(Alter As Integer, Sex As String, Tafel As String, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   Dim vek As Variant

   

   vek = v_lx(Alter, Sex, Tafel, GebJahr, Rentenbeginnalter, Schicht)

   Act_lx = vek(Alter)



End Function





Private Function v_tx(Endalter As Integer, Sex As String, Tafel As String, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Variant

    ' erzeugt Vektor der tx (#Tote)

    Dim vek() As Variant

    Dim i As Integer

    

    Dim Grenze As Integer

    

    If Endalter = -1 Then

        Grenze = max_Alter

    Else

        Grenze = Endalter

    End If

    

    ReDim vek(Grenze)

    Dim v_Temp_lx As Variant

    v_Temp_lx = vMAX_ALTERe, Sex, Tafel, GebJahr, Rentenbeginnalter, Schicht)

        

    For i = 0 To Grenze - 1

        vek(i) = v_Temp_lx(i) - v_Temp_lx(i + 1)

        vek(i) = WorksheetFunction.Round(vek(i), rund_tx)

    Next i

    v_tx = vek()

End Function



Public Function Act_tx(Alter As Integer, Sex As String, Tafel As String, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   Dim vek As Variant

   vek = v_tx(Alter, Sex, Tafel, GebJahr, Rentenbeginnalter, Schicht)

   Act_tx = vek(Alter)

End Function



Private Function v_Dx(Endalter As Integer, Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Variant

    ' erzeugt Vektor der Dx

    Dim vek() As Variant

    Dim i As Integer

    

    Dim Grenze As Integer

    

    If Endalter = -1 Then

        Grenze = max_Alter

    ElseMAX_ALTER

        Grenze = Endalter

    End If
MAX_ALTERMAX_ALTER
    MAX_ALTER

    ReDim vek(Grenze)

    Dim v As Double

    v = 1 / (1 + Zins)

    

    Dim v_Temp_lx As Variant

    v_Temp_lx = v_lx(Grenze, Sex, Tafel, GebJahr, Rentenbeginnalter, Schicht)

            

    For i = 0 To Grenze

        vek(i) = v_Temp_lx(i) * v ^ i

        vek(i) = WorksheetFunction.Round(vek(i), rund_Dx)

    Next i

    v_Dx = vek()

End Function



Public Function Act_Dx(Alter As Integer, Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   ' Überprüfe, ob das Dictionary initialisiert ist

    If cache Is Nothing Then

        Call InitializeCache
MAX_ALTER
    End If

    

    Dim MAX_ALTERtringMAX_ALTER
MAX_ALTER
    

    sKey = CreateCacheKey("Dx", Alter, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

    

    ' Überprüfen, ob der Wert bereits im Cache vorhanden ist

    If cache.Exists(sKey) Then

        Act_Dx = cache(sKey)

    Else

        Dim vek As Variant

        vek = v_Dx(Alter, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

        Act_Dx = vek(Alter)

        

        ' Ergebnis im Cache speichern

        cache.Add sKey, Act_Dx

        

    End If

   

   

End Function
MAX_ALTER


Private Function v_Cx(Endalter As Integer, Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Variant

    ' erMAX_ALTERtor der CxMAX_ALTER
MAX_ALTER
    Dim vek() As Variant

    Dim i As Integer

    

    Dim Grenze As Integer

    

    If Endalter = -1 Then

        Grenze = max_Alter

    Else

        Grenze = Endalter

    End If

    

    ReDim vek(Grenze)

    Dim v As Double

    v = 1 / (1 + Zins)

    

    Dim v_Temp_tx As Variant

    v_Temp_tx = v_tx(Grenze, Sex, Tafel, GebJahr, Rentenbeginnalter, Schicht)

            

    For i = 0 To Grenze - 1

        vek(i) = v_Temp_tx(i) * v ^ (i + 1)

        vek(i) = WorksheetFunction.Round(vek(i), rund_Cx)

    Next i

    v_Cx = vek()

End Function



Public Function Act_Cx(Alter As Integer, Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   

   ' Überprüfe, ob das Dictionary initialisiert ist

    If cache Is Nothing Then

        Call InitializeCache

    End If

    

    Dim sKey As String

    

    sKey = CreateCacheKey("Cx", Alter, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

    

    ' Überprüfen, ob der Wert bereits im Cache vorhanden ist

    If cache.Exists(sKey) Then

        Act_Cx = cache(sKey)

    Else

        Dim vek As Variant

        vek = v_Cx(Alter, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

        Act_Cx = vek(Alter)

        

        ' Ergebnis im Cache speichern

        cache.Add sKey, Act_Cx

        

    End If

End Function



Private Function v_Nx(Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Variant

    ' erzeugt Vektor der Nx

    Dim vek() As Variant

    Dim i As Integer

    ReDim vek(max_Alter)

    

    Dim v_Temp_Dx As Variant

    v_Temp_Dx = v_Dx(-1, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

            

    vek(max_Alter) = v_Temp_Dx(max_Alter)

    For i = max_Alter - 1 To 0 Step -1

        vek(i) = vek(i + 1) + v_Temp_Dx(i)

        vek(i) = WorksheetFunction.Round(vek(i), rund_Dx)

    Next i

    v_Nx = vek()

End Function



Public Function Act_Nx(Alter As Integer, Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   

   ' Überprüfe, ob das Dictionary initialisiert ist

    If cache Is Nothing Then

        Call InitializeCache

    End If

    

    Dim sKey As String

    

    sKey = CreateCacheKey("Nx", Alter, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

    

    ' Überprüfen, ob der Wert bereits im Cache vorhanden ist

    If cache.Exists(sKey) Then

        Act_Nx = cache(sKey)

    Else

        Dim vek As Variant

        vek = v_Nx(Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

        Act_Nx = vek(Alter)

        

        ' Ergebnis im Cache speichern

        cache.Add sKey, Act_Nx

        

    End If

   

End Function



Private Function v_Mx(Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Variant

    ' erzeugt Vektor der Mx

    Dim vek() As Variant

    Dim i As Integer

    ReDim vek(max_Alter)

    

    Dim v_Temp_Cx As Variant

    v_Temp_Cx = v_Cx(-1, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

            

    vek(max_Alter) = v_Temp_Cx(max_Alter)

    For i = max_Alter - 1 To 0 Step -1

        vek(i) = vek(i + 1) + v_Temp_Cx(i)

        vek(i) = WorksheetFunction.Round(vek(i), rund_Mx)

    Next i

    v_Mx = vek()

End Function



Public Function Act_Mx(Alter As Integer, Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   

   ' Überprüfe, ob das Dictionary initialisiert ist

    If cache Is Nothing Then

        Call InitializeCache

    End If

    

    Dim sKey As String

    

    sKey = CreateCacheKey("Mx", Alter, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

    

    ' Überprüfen, ob der Wert bereits im Cache vorhanden ist

    If cache.Exists(sKey) Then

        Act_Mx = cache(sKey)

    Else

        Dim vek As Variant

        vek = v_Mx(Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

        Act_Mx = vek(Alter)

        

        ' Ergebnis im Cache speichern

        cache.Add sKey, Act_Mx

        

    End If

End Function



Private Function v_Rx(Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Variant

    ' erzeugt Vektor der Rx

    Dim vek() As Variant

    Dim i As Integer

    ReDim vek(max_Alter)

    

    Dim v_Temp_Mx As Variant

    v_Temp_Mx = v_Mx(Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

            

    vek(max_Alter) = v_Temp_Mx(max_Alter)

    For i = max_Alter - 1 To 0 Step -1

        vek(i) = vek(i + 1) + v_Temp_Mx(i)

        vek(i) = WorksheetFunction.Round(vek(i), rund_Rx)

    Next i

    v_Rx = vek()

End Function



Public Function Act_Rx(Alter As Integer, Sex As String, Tafel As String, Zins As Double, Optional GebJahr As Integer, Optional Rentenbeginnalter As Integer, Optional Schicht As Integer = 1) As Double

   

   ' Überprüfe, ob das Dictionary initialisiert ist

    If cache Is Nothing Then

        Call InitializeCache

    End If

    

    Dim sKey As String

    

    sKey = CreateCacheKey("Rx", Alter, Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

    

    ' Überprüfen, ob der Wert bereits im Cache vorhanden ist

    If cache.Exists(sKey) Then

        Act_Rx = cache(sKey)

    Else

        Dim vek As Variant

        vek = v_Rx(Sex, Tafel, Zins, GebJahr, Rentenbeginnalter, Schicht)

        Act_Rx = vek(Alter)

        

        ' Ergebnis im Cache speichern

        cache.Add sKey, Act_Rx

        

    End If

End Function





Public Function Act_Altersberechnung(GebDat As Date, BerDat As Date, Methode As String) As Integer

   ' Altersberechnung nach Kalenderjahresmethode (K) bzw. Halbjahresmethode (H)



   If Methode <> "K" Then Methode = "H"

   Dim J_GD As Integer

   Dim J_BD As Integer

   Dim M_GD As Integer

   Dim M_BD As Integer



   J_GD = Year(GebDat)

   J_BD = Year(BerDat)

   M_GD = Month(GebDat)

   M_BD = Month(BerDat)



   Select Case Methode

      Case "K"

         Act_Altersberechnung = J_BD - J_GD

      Case "H"

         Act_Altersberechnung = Int(J_BD - J_GD + 1# / 12# * (M_BD - M_GD + 5))

   End Select



End Function











Private Function CreateCacheKey(Art As String, Alter As Integer, Sex As String, Tafel As String, Zins As Double, GebJahr As Integer, Rentenbeginnalter As Integer, Schicht As Integer) As String

    CreateCacheKey = Art & "_" & Alter & "_" & Sex & "_" & Tafel & "_" & Zins & "_" & GebJahr & "_" & Rentenbeginnalter & "_" & Schicht



End Function