Hallo zusammen, der Hinweis auf die Seite Gesetze-im-Internet ist gut, die könnte man nutzen, um die Excel-Formel nicht von Hand updaten zu müssen. Dafür könnten die Daten von der Website ausgelesen und zur Berechnung verwendet werden. Dafür könnte man mittels VBA eine eigene Funktion in Excel erstellen (sog. "user defined function"). Die könnte dann z.B. FESTZUSETZENDE_EST( ) heißen und die festzusetzende Einkommensteuer für das in Bezug genommene zvE errechnen. Dabei könnte man einen optionalen Parameter für den Splittingtarif mitgeben, sodass bspw. FESTZUSETZENDE_EST(50.000,00;FALSCH) = 10.906,- und FESTZUSETZENDE_EST(50.000,00;WAHR) = 6.115,- wobei FALSCH und WAHR auch mit 0 und 1 ersetzt werden könnten. Diese Funktion könnte dann bei jedem Aufruf der Arbeitsmappe, in der sie verwendet wird, einmal im Hintergrund "ins Internet gehen" und die Tarif-Eckdaten von der vom BMJ gepflegten und stets aktuellen Seite abrufen. Das funktioniert jedenfalls solange, wie sich die Struktur der Seite oder der Gesetzeswortlaut nicht ändert. Der in einem Modul im Visual-Basic-Editor (alt+F11, oben links auf "DieseArbeitsmappe" rechtsklicken > Einfügen > Modul) in Excel einzufügende Code könnte z.B. so aussehen: Option Explicit
Public dblGrundfreibetrag As Double
Public dblStufe2 As Double
Public dblStufe2Var1 As Double
Public dblStufe2Var2 As Double
Public dblStufe3 As Double
Public dblStufe3Var1 As Double
Public dblStufe3Var2 As Double
Public dblStufe3Var3 As Double
Public dblStufe4 As Double
Public dblStufe4Var1 As Double
Public dblStufe5Var1 As Double
Public dblSolZFreigrenze As Double
Function FESTZUSETZENDE_EST(dblZVE As Double, Optional blnSPLITTING As Boolean) As Double
Dim x As Double
Dim y As Double
Dim z As Double
Dim dblESt As Double
'Prüfen, ob aktueller Tarif für diese Sitzung bereits abgerufen wurde
If dblGrundfreibetrag = 0 Then
Call Get_ESt_Tarif
End If
If blnSPLITTING Then dblZVE = dblZVE / 2
x = WorksheetFunction.RoundDown(dblZVE, 0)
y = (x - dblGrundfreibetrag) / 10000
z = (x - dblStufe2) / 10000
Select Case dblZVE
Case Is <= dblGrundfreibetrag
dblESt = 0
Case Is <= dblStufe2
dblESt = (dblStufe2Var1 * y + dblStufe2Var2) * y
Case Is <= dblStufe3
dblESt = (dblStufe3Var1 * z + dblStufe3Var2) * z + dblStufe3Var3
Case Is <= dblStufe4
dblESt = 0.42 * x - dblStufe4Var1
Case Else 'Stufe 5
dblESt = 0.45 * x - dblStufe5Var1
End Select
If blnSPLITTING Then dblESt = 2 * dblESt
FESTZUSETZENDE_EST = WorksheetFunction.RoundDown(dblESt, 0)
End Function
Function FESTZUSETZENDER_SOLZ(dblESt As Double, Optional blnSPLITTING As Boolean) As Double
If dblSolZFreigrenze = 0 Then
Call Get_SolZ_Freigrenze
End If
If blnSPLITTING Then
If dblESt <= 2 * dblSolZFreigrenze Then dblESt = 0
Else
If dblESt <= dblSolZFreigrenze Then dblESt = 0
End If
FESTZUSETZENDER_SOLZ = 0.055 * dblESt
End Function
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
Sub Get_SolZ_Freigrenze()
Dim objHTTP As Object
Dim objHTML As Object
Dim objListOfElements As Object
Dim objElement As Object
Dim strURL As String
Dim strSolZFreigrenze As String
strURL = "https://www.gesetze-im-internet.de/solzg_1995/__3.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")
strSolZFreigrenze = objListOfElements.Item(9).ChildNodes.Item(0).innerText
strSolZFreigrenze = Replace(strSolZFreigrenze, " ", "")
strSolZFreigrenze = Replace(Right(strSolZFreigrenze, Len(strSolZFreigrenze) - Len("inanderenFällen")), "Euro", "")
dblSolZFreigrenze = strSolZFreigrenze
End Sub Danach den Visual-Basic-Editor schließen. In Excel ist jetzt die Funktion =FESTZUSETZENDE_EST( ) verfügbar. Bei Fragen gerne Fragen. Liebe Grüße Lucas
... Mehr anzeigen