Option Explicit

Private Sub BerechneKostenButton_Click()
    On Error GoTo Fehlerbehandlung

    Dim Erwachsene As Integer
    Dim Jugendliche As Integer
    Dim Kinder As Integer
    Dim Naechte As Integer

    Dim Kosten As Double

    ' Löscht die Ausgabe, war nicht in der Aufgabe gefordert
    Cells(2, 2) = ""

    Erwachsene = eingabekontrolle(ErwachseneInput.Text)
    Jugendliche = eingabekontrolle(JugendlicheInput.Text)
    Kinder = eingabekontrolle(KinderInput.Text)
    Naechte = eingabekontrolle(NaechteInput.Text)

    plausikontrolle Erwachsene, Jugendliche, Kinder, Naechte

    Kosten = BerechneKosten(Erwachsene, Jugendliche, Kinder, Naechte)

    Cells(2, 2) = Kosten
    Unload Me
    Exit Sub
Fehlerbehandlung:
    MsgBox ("Fehler: " & Err.Description)
End Sub


Private Function eingabekontrolle(ByVal eingabe As StringAs Integer
    eingabekontrolle = True

    If Not IsNumeric(eingabe) Then
        Err.Raise 5001, "eingabekontrolle""Der von Ihnen eingegebene Wert muß eine Zahl sein! "
    End If
    eingabekontrolle = CInt(eingabe)

    If (eingabekontrolle < 0) Then
        Err.Raise 5002, "eingabekontrolle""Der von Ihnen eingegebene Wert muß größer oder gleich Null sein! "
    End If
End Function


Private Sub plausikontrolle(ByVal Erwachsene As IntegerByVal Jugendliche As Integer, _
    ByVal Kinder As IntegerByVal Naechte As Integer)
    Const AnzahlBetten As Integer = 30
    Const MaxKinderProErwachsener As Integer = 6
    Const MinErwachsene As Integer = 2

    If Naechte <= 0 Then
        Err.Raise 5003, "plausikontrolle""Sie müssen mindestens eine Nacht buchen."
    End If

    If Erwachsene < MinErwachsene Then
        Err.Raise 5004, "plausikontrolle""Es müssen mindestens zwei Erwachsene mitfahren."
    End If

    If (Erwachsene * MaxKinderProErwachsener) < (Kinder + Jugendliche) Then
        Err.Raise 5005, "plausikontrolle""Es muss mindestens 1 Erwachsener je 6 Minderjährige mitfahren."
    End If

    If (Erwachsene + Jugendliche + Kinder) > AnzahlBetten Then
        MsgBox ("Denken Sie daran, Luftmatratzen und Schlafsäcke mitzubringen.")
    End If
End Sub


Private Function BerechneKosten(ByVal Erwachsene As IntegerByVal Jugendliche As Integer, _
    ByVal Kinder As IntegerByVal Naechte As Integer) _
    As Double

    Const Mindestbetrag As Double = 50

    Const RabattKinderreich As Double = 7 / 100
    Const RabattGrossgruppe As Double = 5 / 100
    Const GrenzeGrossgruppe As Integer = 30

    Const PreisErwachsener As Integer = 12
    Const PreisJugendlicher As Integer = 6
    Const PreisKind As Integer = 3

    Dim Betrag As Double

    Betrag = Erwachsene * PreisErwachsener + Jugendliche * PreisJugendlicher + Kinder * PreisKind

    If Erwachsene < (Kinder + Jugendliche) Then
        Betrag = Betrag * (1 - RabattKinderreich)
    ElseIf (Erwachsene + Jugendliche + Kinder) > GrenzeGrossgruppe Then
        Betrag = Betrag * (1 - RabattGrossgruppe)
    End If

    If Betrag < Mindestbetrag Then
        Betrag = Mindestbetrag
    End If

    Betrag = Betrag * Naechte

    BerechneKosten = Betrag
End Function