Option Explicit

Private Sub AuswahlButton_Click()
    On Error GoTo Fehlerbehandlung
    Dim Laenge As Integer
    Dim Breite As Integer
    Dim Hoehe As Integer
    Dim Entfernung As Integer
    Dim Gewicht As Integer

    Laenge = wandle_in_double_um(LaengeInput.Text)
    Breite = wandle_in_double_um(BreiteInput.Text)
    Hoehe = wandle_in_double_um(HoeheInput.Text)
    Entfernung = wandle_in_double_um(EntfernungInput.Text)
    Gewicht = wandle_in_double_um(GewichtInput.Text)

    pruefe_ob_positiv Laenge
    pruefe_ob_positiv Breite
    pruefe_ob_positiv Hoehe
    pruefe_ob_positiv Entfernung
    pruefe_ob_positiv Gewicht

    pruefe_entfernung Entfernung
    pruefe_masse Laenge, Breite, Hoehe
    plausi_gewicht Gewicht

    DienstleisterOutput.Text = bestimme_dienstleister(Laenge, Breite, Hoehe, Gewicht, Entfernung)

    Exit Sub
Fehlerbehandlung:
    MsgBox ("Fehler: " & Err.Description)
End Sub


Function bestimme_dienstleister(ByVal Laenge As IntegerByVal Breite As Integer, _
    ByVal Hoehe As IntegerByVal Gewicht As IntegerByVal Entfernung As Integer) _
    As String

    Const WPS_ENTFERNUNG As Integer = 50
    Const UPS_GEWICHT As Integer = 50
    Const KUBIK As Long = 1000000
    Dim Volumen As Long

    Volumen = berechne_volumen(Laenge, Breite, Hoehe)

    If Entfernung < WPS_ENTFERNUNG Then
        bestimme_dienstleister = "WPS"
    ElseIf Volumen < KUBIK Then
        bestimme_dienstleister = "DHL"
    ElseIf Volumen < 2 * KUBIK Then
        bestimme_dienstleister = "UPS"
    ElseIf Gewicht < UPS_GEWICHT Then
        bestimme_dienstleister = "UPS"
    Else
        bestimme_dienstleister = "DHL"
    End If
End Function


Function berechne_volumen(ByVal Laenge As IntegerByVal Breite As LongByVal Hoehe As LongAs Long
    berechne_volumen = Laenge * Breite * Hoehe
End Function


Sub plausi_gewicht(ByVal Gewicht As Integer)
    Const MAX_GEWICHT As Integer = 100
    If Gewicht > MAX_GEWICHT Then
        MsgBox ("Das Gewicht ist sehr hoch! Sicher?")
    End If
End Sub


Sub pruefe_masse(ByVal Laenge As IntegerByVal Breite As IntegerByVal Hoehe As Integer)

    If Laenge = Breite And Breite = Hoehe Then
        Err.Raise 5003, "pruefe_masse""Alle Seiten sind gleich lang"
    End If

    If Laenge + Breite > Hoehe Then
        Err.Raise 5004, "pruefe_masse""Laenge plus Breite größer Höhe"
    End If
End Sub


Sub pruefe_ob_positiv(ByVal zahl As Integer)
    If zahl <= 0 Then
        Err.Raise 5001, "pruefe_ob_positiv""Nur positive Zahlen eingeben!"
    End If
End Sub


Sub pruefe_entfernung(ByVal Entfernung As Integer)
    Const maxEntfernung As Integer = 1000

    If Entfernung > maxEntfernung Then
        Err.Raise 5002, "pruefe_entfernung""Entfernung zu groß"
    End If
End Sub


Function wandle_in_double_um(ByVal eingabe As StringAs Double

    If Not IsNumeric(eingabe) Then
        Err.Raise 5000, "wandle_in_double_um""Alle Eingaben müssen Zahlen sein."
    End If

    wandle_in_double_um = CDbl(eingabe)
End Function