[Excel, VBA] Abschreibung / Afa

Gepostet am: May 19, 2011 4:22:16 PM

Excel bietet zwar von sich aus einige Abschreibungsfunktionen, wie LIA, GDA, GDA2 und DIA. Keine dieser Funktionen wird leider der österreichischen Rechtslage gerecht. Mit LIA kann man zwar den die GanzJahres-Abschreibung recht gut berechnen. 

Will man hingegen die Höhe der Abschreibung für ein bestimmtes Jahr ermitteln, kommt man um recht komplizierte WENN-Funktionen nicht herum. 

Abschreibungshoehe für ein bestimmtes Jahr

=WENN(MONAT(Anschaffungsdatum)>6;WENN(JAHR(Anschaffungsdatum)=Jahr;LIA(Anschaffungskosten;Restwert;Nutzungsdauer)/2;WENN(JAHR(Anschaffungsdatum)+Nutzungsdauer=Jahr;LIA(Anschaffungskosten;Restwert;Nutzungsdauer)/2;WENN(UND(JAHR(Anschaffungsdatum)<Jahr;JAHR(Anschaffungsdatum)+Nutzungsdauer-1>=Jahr);LIA(Anschaffungskosten;Restwert;Nutzungsdauer);"")));WENN(JAHR(Anschaffungsdatum)+Nutzungsdauer-1>=Jahr;LIA(Anschaffungskosten;Restwert;Nutzungsdauer);""))

Wie man sieht ist die kombinierte Formel, die das Anschaffungsjahr berücksichtig, recht kompliziert, was die praktische Anwendung im Alltag eigentlich unmöglich macht. Die Lösung ist in meinen Augen nur mit VBA einigermaßen praktikabel:

Afa für ein bestimmtes Jahr mit VBA

Public Function AfA(Betrag As Double, Jahre As Integer, aktuellesJahr As Integer, Anschaffungsdatum As Date, _     Optional Restwert As Double = 0, Optional ErinnerungsWert As Double = 0.01) As Double     'Diese Funktion berechnet den Abschreibungswert eines bestimmten Jahres          If Year(Anschaffungsdatum) > aktuellesJahr Then         AfA = 0 'dann ist das Anlagengut noch gar nicht angeschafft     Else         If (Month(Anschaffungsdatum) > 6) And (aktuellesJahr = Year(Anschaffungsdatum)) Then             'Halbjahresabschreibung             AfA = WorksheetFunction.SLN(Betrag, Restwert, Jahre) / 2         ElseIf (Month(Anschaffungsdatum) > 6) And (aktuellesJahr = (Year(Anschaffungsdatum) + Jahre)) Then             'Halbjahresabschreibung uU um Erinnerungswert bereinigt             AfA = WorksheetFunction.SLN(Betrag, Restwert, Jahre) / 2 - ErinnerungsWert         ElseIf (Month(Anschaffungsdatum) > 6) And (aktuellesJahr > Year(Anschaffungsdatum)) And (aktuellesJahr < (Year(Anschaffungsdatum) + Jahre)) Then             'ganze Jahre bei der Halbjahresabschreibung             AfA = WorksheetFunction.SLN(Betrag, Restwert, Jahre)         ElseIf (Month(Anschaffungsdatum) <= 6) And (aktuellesJahr < (Year(Anschaffungsdatum) + Jahre - 1)) Then             'ganzJahresAbschreibung             AfA = WorksheetFunction.SLN(Betrag, Restwert, Jahre)         ElseIf (Month(Anschaffungsdatum) <= 6) And (aktuellesJahr = (Year(Anschaffungsdatum) + Jahre - 1)) Then             'ganzJahresAbschreibung uU um Erinnerungswert bereinigt             AfA = WorksheetFunction.SLN(Betrag, Restwert, Jahre) - ErinnerungsWert         Else             AfA = 0 'bereits vollkommen abgeschrieben         End If     End IfEnd Function

Eine andere Funktion

BerechnungAfA

Public Function BerechnungAfA(AK As Double, ND As Integer, aktJ As Integer, Optional bHalbjahresabschreibung As Boolean = False) As DoubleIf bHalbjahresabschreibung = True Then     If ((aktJ = 1) Or (aktJ = ND + 1)) Then         BerechnungAfA = AK / ND / 2     ElseIf aktJ > ND + 1 Then         BerechnungAfA = 0     Else         BerechnungAfA = AK / ND     End IfElse     If aktJ > ND Then         BerechnungAfA = 0     Else         BerechnungAfA = AK / ND     End IfEnd IfEnd Function

Für die kummulierte Abschreibung zwischen zwei Datumswerten:

Textfeld

Public Function kumAfa(Anschaffungskosten As Double, Nutzungsdauer As Integer, StartDatum As Date, EndDatum As Date, Optional Restwert As Double = 0) As Double     Dim AfaJahr As Double     Dim i As Integer     AfaJahr = (Anschaffungskosten - Restwert) / Nutzungsdauer     Dim kAfa As Double     kAfa = 0     For i = Year(StartDatum) To Year(EndDatum)         If i = Year(StartDatum) And Month(StartDatum) > 6 Then             kAfa = kAfa + (AfaJahr / 2)         ElseIf i = Year(EndDatum) And Month(EndDatum) < 7 Then             kAfa = kAfa + (AfaJahr / 2)         Else             kAfa = kAfa + AfaJahr         End If         Debug.Print i & " = " & kAfa     Next     If kAfa >= (Anschaffungskosten - Restwert) Then         kumAfa = (Anschaffungskosten - Restwert)     Else         kumAfa = kAfa     End IfEnd Function