Option Explicit

Private Sub berechnenButton_Click()
    ' Fehlerbehandlung
    On Error GoTo Fehleranzeigen
    ' Variablen deklarieren
    Dim wzcode As Double
    Dim abrufeMitGuV As Integer
    Dim abrufeOhneGuV As Integer
    Dim rest As Integer
    Dim preis As Double
    Dim preisOhne  As Double
    Dim gesamtpreis As Double

    ' Konstanten deklarieren
    Const anzahlBilanzenFuerPeergroup4 As Integer = 4
    Const anzahlBilanzenFuerPeergroup3 As Integer = 3
    Const anzahlBilanzenFuerPeergroup2 As Integer = 2

    Const mindermengenZuschlag As Double = 50
    Const mindermengenGrenze = 500
    Const rabatt As Double = 0.8
    Const rabattGrenze As Long = 10000

    Const peergroup2 As Double = 100
    Const peergroup3 As Double = 140
    Const peergroup4 As Double = 170

    Const bilanzen2 As Double = 80
    Const bilanzen3 As Double = 110
    Const bilanzen4 As Double = 130

    preis = 0
    preisOhne = 0
    gesamtpreis = 0
   ' Daten holen
    wzcode = wandle_in_long_um(WzcodeInput.Text)
    abrufeMitGuV = wandle_in_int_um(MitGuVInput.Text)
    abrufeOhneGuV = wandle_in_int_um(OhneGuVInput.Text)
    ' Eingaben überprüfen
    pruefeBranchenCode wzcode
    pruefeObBank wzcode
    pruefeObPositiveZahl abrufeMitGuV
    pruefeObPositiveZahl abrufeOhneGuV

    ' Bilanzen mit GuV
    rest = dividiereDurchModulo(abrufeMitGuV, anzahlBilanzenFuerPeergroup4)
    preis = (abrufeMitGuV \ anzahlBilanzenFuerPeergroup4) * peergroup4

    If rest = anzahlBilanzenFuerPeergroup3 Then
        preis = preis + peergroup3
    ElseIf rest < anzahlBilanzenFuerPeergroup3 And rest > 0 Then
        preis = preis + peergroup2
    End If

    ' Bilanzen ohne GuV
    rest = dividiereDurchModulo(abrufeOhneGuV, anzahlBilanzenFuerPeergroup4)
    preisOhne = (abrufeOhneGuV \ anzahlBilanzenFuerPeergroup4) * bilanzen4

    If rest = anzahlBilanzenFuerPeergroup3 Then
        preisOhne = preisOhne + bilanzen3
    ElseIf rest < anzahlBilanzenFuerPeergroup3 And rest > 0 Then
        preisOhne = preisOhne + bilanzen2
    End If

    ' Mindermengen sowie Rabatt prüfen
    If preis + preisOhne > rabattGrenze Then
        gesamtpreis = (preis + preisOhne) * rabatt
    End If
    If preis + preisOhne < mindermengenGrenze And preis + preisOhne > 0 Then
        MsgBox ("Mindermengenzuschlag")
        gesamtpreis = preis + preisOhne + mindermengenZuschlag
    End If

    If gesamtpreis <> 0 Then
        PreisOutput.Text = gesamtpreis
    Else
        PreisOutput.Text = preis + preisOhne
    End If

    Exit Sub

Fehleranzeigen:
    MsgBox ("Folgender Fehler ist leider aufgetreten: " & Err.Description)
End Sub

Function wandle_in_int_um(ByVal eingabe As StringAs Integer
    If Not IsNumeric(eingabe) Then
        Err.Raise 5000, "wandle_in_int_um", "Bitte nur Zahlen eingeben"
    End If
    wandle_in_int_um = CInt(eingabe)
End Function

Function wandle_in_long_um(ByVal eingabe As StringAs Long
    If Not IsNumeric(eingabe) Then
        Err.Raise 5004, "wandle_in_long_um", "Bitte nur Zahlen eingeben"
    End If
    wandle_in_long_um = CLng(eingabe)
End Function

Sub pruefeObPositiveZahl(ByVal zahl As Integer)
    If zahl < 0 Then
        Err.Raise 5001, "pruefeObPositiveZahl", "Zahl muss positiv sein"
        Exit Sub
    End If
End Sub

Sub pruefeObBank(ByVal wzcode As Long)
    If wzcode >= 80000 And wzcode < 90000 Then
        Err.Raise 5002, "pruefeObBank", "Branchencodes beginnend mit einer 8 sind unzulaessig"
        Exit Sub
    End If
End Sub

Sub pruefeBranchenCode(ByVal wzcode As Long)
    If wzcode <= 9999 Or wzcode > 99999 Then
        Err.Raise 5003, "pruefeBranchenCode", "Branchencode ist eine fuenfstellige Zahl"
        Exit Sub
    End If
End Sub

Function dividiereDurchModulo(abrufeMitGuV, dividend) As Integer
    dividiereDurchModulo = abrufeMitGuV Mod dividend
End Function