Wenn man lediglich die Steuerlast zu einem gegebenen zvE wissen möchte, dann ist die BMF-Formel zweifellos ein gutes Mittel.
Wenn man hingegen innerhalb eines Excel-Programms, das zunächst ein oder mehrere zvE berechnet hat, das dann die zugehörigen ESt-Werte benötigt, um diese in Folgeschritten weiter zu verarbeiten, dann ist es ziemlich unpraktisch, wenn man an der Stelle der ESt-Ermittlung - unter Unterbrechung der Rechnung - mittels des BMF-Programms manuell nachhelfen muss, diesen Rechenschritt zu vollziehen. Dann ist es wünschenswert, dass das Excel-Programms diese Berechnung autonom - ohne äußeren Eingriff - selbst vollzieht. Dazu braucht man dann die Excel-Steuerformel.
Beispiel hierfür: Man möchte berechnen, welches Netto-Einkommen sich aus Einkünften diverser Quellen (etwa gesetzliche Rente, Firmenrente, Kapitaleinkünften - unter Berücksichtigung von Einkommensteuer, Lohnsteuer und Steuervorauszahlungen) innerhalb eines Jahres Monat für Monat ergibt, wobei unterjährig auch noch Anpassungen der Renten stattfinden. Möchte man zusätzlich etwa auch noch einen Vergleich mit dem vorausgehenden Jahr erhalten, dann erweist sich die in das Excel-Programm integrierte Steuerformel als noch unentbehrlicher.
bitte gerne, bin auch gespannt - geben Sie mal Bescheid!
Auf ähnliche Weise lassen sich übrigens auch Abrufe für Bodenrichtwerte, Wertpapiere, Wechselkurse, Lebenserwartungen sowie sämtliche Faktoren und Werte des Bewertungsgesetzes in handliche Excel-Formeln verpacken...
Der Vorteil solcher Lösungen liegt - neben der Aktualität - auch darin, dass die Funktionen relativ einfach kanzleiweit in allen Excel-Mappen verfügbar gemacht werden können.
Hallo Herr Eberhardt,
will man lediglich eine Steuerlast aus einem gegebenen zvE bestimmen, dann ist die BMF-Formel zweifellos die richtige Wahl. Darin stimme ich Ihnen zu.
Wenn hingegen eine Excel-Anwendung aus diversen Einkünfte-Daten ein oder auch mehrere zvE-Werte ermittelt hat, zu denen die zugehörigen Steuerlasten (ESt) zu bestimmen sind, um diese in einem Folgeschritt weiter zu verarbeiten, dann wäre die Bestimmung mittels BMF-Formel außerhalb des Excel-Programms (also unter Unterbrechung der Weiterbearbeitung durch einen manuellen Zwischenschritt), wenig praktikabel. Da braucht es dann die in die Excel-Anwendung integrierte Excel-Steuerformel. Damit läuft die gesamte Rechnung ohne das händische Zutun eines Anwenders in einem einzigen Schritt automatisch ab. Dazu ist die Steuerformel derzeit im 2-Jahres-Rhythmus lediglich um die gesetzlich neu festgelegten Parameter (derzeit 2 Parameter je Steuerjahr) zu ergänzen.
Beispiel einer solchen Anwendung: Ein Anwender möchte das Netto-Einkommen aus all seinen Brutto-Einkünften (z. B. gesetzliche Rente, Firmenrente, Kapitaleinkünfte) für ein Jahr Monat für Monat – unter Berücksichtigung von Einkommensteuer, Lohnsteuer, Steuern auf Kapitalerträge und Steuervorauszahlungen – ermitteln und dabei auch noch einen Vergleich mit dem vorausgehenden Jahr vornehmen.
Grüße an den Bodensee aus dem Raum Ulm
B. Klahn
Alles klar.
Kein thema wenn Sie permanent Variablen verändern und damit auch das zvE dann wird das mit dem Internetrechner etwas lästig, da ist natürlich eleganter ich habe ein Excel Tool mit eingebauter Funktion.
Das habe ich so dem ursprünglichen Sachverhalt nicht entnommen.
Wie christian_kunz, nur ohne WENN, aber für 2025:
E = auf volle € abgerundetes zu versteuerndes Einkommen
Splittingtarif: 2 x Grundtarif für E/2.
=GANZZAHL(
(E>12096)*(E<=17443)*((14%+(E-12096)*932,3*10^-8)*(E-12096))+
(E>17443)*(E<=68480)*((23,97%+(E-17443)*176,64*10^-8)*(E-17443)+1015,13)+
(E>68480)*(E<=277825)*(42%*E-10911,92)+(E>277825)*(45%*E-19246,67))
Hi @LuPi1801 , vielen Dank für den Code! Bei mir läuft Get_ESt_Tarif() nicht, der Debugger zeigt:
Ich kann allerdings nicht so viel damit anfangen und wäre für einen Hinweis dankbar 🙂
... hey @Stuttgart74, freut mich, dass es endlich mal jemand probiert!
Ursache: Im Gesetzestext auf der Website, auf die zurückgegriffen wird, ist das Multiplikationssymbol (nach dem der Code unter anderem sucht, um zu "verstehen" welche Zeichen was sind) geändert worden. Deshalb highlighted der Debugger auch die Codezeile, die nach dem Multiplikationspunkt sucht - weil er den nicht findet (am Ende der gelben Zeile, das Zeichen zwischen den Anführungsstrichen).
Lösung: Gehe auf die Seite www.gesetze-im-internet.de > rufe den Tarif (32a EStG) auf, kopiere dort einen der Multiplikationspunkte und ersetze den bisher im Code verwendeten Multiplikationspunkt mit dem aktuellen Zeichen (müsste an mehreren Stellen vorkommen).
Sag gerne Bescheid, obs klappt oder nicht oder falls du noch Fragen hast!
Vielen Dank @LuPi1801 ! Jetzt läuft es, aber irgendwie falsch: =FESTZUSETZENDE_EST(100000, FALSE) ergibt -1049192...
Alter Schwede, schön geschrieben 😍 werde ich mal ausprobieren 👍
Einfache Anbindung aller Mandanten ans DMS mit meineKanzlei.io
Kollegenseminar buchen: Next Level Digitalisierung mit DATEV
@Stuttgart74 ich vermute, dass du aus Versehen einen normalen Punkt mit ausgetauscht hast und daher falsche Werte berechnet wurden (die Dinger sehen sich aber auch **bleep** ähnlich!)
Hier einmal der aktualisierte Abschnitt ("Sub") zum kopieren und Austauschen am Stück:
Sub Get_ESt_Tarif()
Dim objHTTP As Object
Dim objHTML As Object
Dim objListOfElements As Object
Dim strURL As String
Dim strGrundfreibetrag As String
Dim strStufe2 As String
Dim strStufe2Var1 As String
Dim strStufe2Var2 As String
Dim strStufe3 As String
Dim strStufe3Var1 As String
Dim strStufe3Var2 As String
Dim strStufe3Var3 As String
Dim strStufe4 As String
Dim strStufe4Var1 As String
Dim strStufe5Var1 As String
strURL = "https://www.gesetze-im-internet.de/estg/__32a.html"
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
objHTTP.Open "GET", strURL, False
objHTTP.Send
Do While objHTTP.Status <> 200
DoEvents
If objHTTP.Status > 400 Then Exit Sub
Loop
Set objHTML = CreateObject("htmlfile")
objHTML.body.innerHTML = objHTTP.responseText
Set objListOfElements = objHTML.getElementsByTagName("dd")
'1.
strGrundfreibetrag = objListOfElements.Item(0).ChildNodes.Item(0).innerText
strGrundfreibetrag = Replace(strGrundfreibetrag, " ", "")
strGrundfreibetrag = Right(strGrundfreibetrag, Len(strGrundfreibetrag) - (InStr(1, strGrundfreibetrag, "bis") + 2))
strGrundfreibetrag = Left(strGrundfreibetrag, InStr(1, strGrundfreibetrag, "Euro") - 1)
'2.
strStufe2 = objListOfElements.Item(1).ChildNodes.Item(0).innerText
strStufe2 = Replace(strStufe2, " ", "")
strStufe2 = Right(strStufe2, Len(strStufe2) - (InStr(1, strStufe2, "bis") + 2))
strStufe2 = Left(strStufe2, InStr(1, strStufe2, "Euro") - 1)
strStufe2Var1 = objListOfElements.Item(1).ChildNodes.Item(1).innerText
strStufe2Var1 = Replace(Replace(Replace(strStufe2Var1, " ", ""), ";", ""), ".", "")
strStufe2Var2 = strStufe2Var1
strStufe2Var1 = Right(strStufe2Var1, Len(strStufe2Var1) - 1)
strStufe2Var1 = Left(strStufe2Var1, InStr(1, strStufe2Var1, "•") - 1)
strStufe2Var2 = Right(strStufe2Var2, Len(strStufe2Var2) - InStr(strStufe2Var2, "+"))
strStufe2Var2 = Left(strStufe2Var2, InStr(1, strStufe2Var2, ")") - 1)
'3.
strStufe3 = objListOfElements.Item(2).ChildNodes.Item(0).innerText
strStufe3 = Replace(strStufe3, " ", "")
strStufe3 = Right(strStufe3, Len(strStufe3) - (InStr(1, strStufe3, "bis") + 2))
strStufe3 = Left(strStufe3, InStr(1, strStufe3, "Euro") - 1)
strStufe3Var1 = objListOfElements.Item(2).ChildNodes.Item(1).innerText
strStufe3Var1 = Replace(Replace(Replace(strStufe3Var1, " ", ""), ";", ""), ".", "")
strStufe3Var2 = strStufe3Var1
strStufe3Var3 = strStufe3Var1
strStufe3Var1 = Right(strStufe3Var1, Len(strStufe3Var1) - 1)
strStufe3Var1 = Left(strStufe3Var1, InStr(1, strStufe3Var1, "•") - 1)
strStufe3Var2 = Right(strStufe3Var3, Len(strStufe3Var3) - InStr(strStufe3Var3, "+"))
strStufe3Var2 = Left(strStufe3Var2, InStr(1, strStufe3Var2, ")") - 1)
strStufe3Var3 = Right(strStufe3Var3, Len(strStufe3Var3) - InStrRev(strStufe3Var3, "+"))
'4.
strStufe4 = objListOfElements.Item(3).ChildNodes.Item(0).innerText
strStufe4 = Replace(strStufe4, " ", "")
strStufe4 = Right(strStufe4, Len(strStufe4) - (InStr(1, strStufe4, "bis") + 2))
strStufe4 = Left(strStufe4, InStr(1, strStufe4, "Euro") - 1)
strStufe4Var1 = objListOfElements.Item(3).ChildNodes.Item(1).innerText
strStufe4Var1 = Replace(Replace(Replace(strStufe4Var1, " ", ""), ";", ""), ".", "")
strStufe4Var1 = Right(strStufe4Var1, Len(strStufe4Var1) - InStr(1, strStufe4Var1, "x") - 1)
'5.
strStufe5Var1 = objListOfElements.Item(4).ChildNodes.Item(1).innerText
strStufe5Var1 = Replace(Replace(Replace(strStufe5Var1, " ", ""), ";", ""), ".", "")
strStufe5Var1 = Right(strStufe5Var1, Len(strStufe5Var1) - InStr(1, strStufe5Var1, "x") - 1)
dblGrundfreibetrag = strGrundfreibetrag
dblStufe2 = strStufe2
dblStufe2Var1 = strStufe2Var1
dblStufe2Var2 = strStufe2Var2
dblStufe3 = strStufe3
dblStufe3Var1 = strStufe3Var1
dblStufe3Var2 = strStufe3Var2
dblStufe3Var3 = strStufe3Var3
dblStufe4 = strStufe4
dblStufe4Var1 = strStufe4Var1
dblStufe5Var1 = strStufe5Var1
End Sub
Danke, komischerweise kriege ich auch damit das Ergebnis -1049192 für =FESTZUSETZENDE_EST(100000, FALSE)
🤔hmm, vielleicht können/wollen wir zwei uns da mal kurzschließen? Bin sicher, das lässt sich machen! Siehe unten: