Option Explicit ' guter Programmierstil gebietet, alles deklarieren zu mssen...

Sub Maximumsort() ' d. Sub sortiert 3 eingegebene Zahlen und gibt d. letzte als Maximum aus...

' (c) 2014 by www.gossmann.at - LV Grundzge der Praktischen & Angewandten Informatik FH-Burgenland, WS14/15
' V 0.9b - last mod. 061014

Dim S_Ausgabestring As String  ' selbsterklrend...
Dim BL_Tauschflag   As Boolean ' in diesem Flag wird vermerkt, ob ein Austausch von Zahlen stattgefunden hat, falls nein sin die Zahlen schon vorzeitig sortier
Dim VR_max_Zahlen   As Variant ' Anzahl der zu sortierenden Zahlen / Variant wegen Inputbox
Dim VR_Zahl         As Variant ' einzulesende Zahl
Dim LG_Puffer       As Double  ' Zwischenspeicher fr Tausch
Dim x, y            As Long    ' Schleifenzhler
Dim DB_ZAHLEN(10)   As Double  ' hier werden die Zahlen gespeichert, sogar Fliekommazahlen zulassen (wird aber nicht hinausposaunt) - Dezimaltrennung VBA-spezifisch mit "." statt Komma

' Errorhandler setzen

On Error GoTo end_prg

' gewnschte Anzahl der Zahlen vom Benutzer holen lassen

re_input:
    VR_max_Zahlen = InputBox("Bitte die gewnschte Anzahl an Zahlen zu sortieren und des Maximums ermitteln eingeben (max. 10) - Vielen Dank!", "Bitte die Anzahl der zu sortierenden Zahlen eingeben", "3")
    If VR_max_Zahlen = "" Then           ' wurde abgebrochen?
       Exit Sub                          ' ja, dann Sub beenden
    End If
If VR_max_Zahlen > 10 Then GoTo re_input ' ist Benutzer ein Nimmersatt und will zu viele Zahlen sortieren lassen, dann ihn mit neuer Aufforderung zur Eingabe bestrafen...

' gewnschte Anzahl d. oben eingebenen Zahl holen lassen (gleich in Schleife)

For x = 1 To VR_max_Zahlen
re_input1:
    VR_Zahl = InputBox("Bitte Zahl" + Str(x) + " eingeben - Vielen Dank!") ' sich hflich beim Benutzer bedanken fr jede Zahl...
    If VR_Zahl = "" Then                                                   ' wurde abgebrochen?
       Exit Sub                                                            ' ja, dann Sub beenden
    End If
    If IsNumeric(VR_Zahl) = False Then GoTo re_input1                      ' Sicherheitsprfung auf Zahlen und nicht alphanumerische Werte...
    DB_ZAHLEN(x) = Val(VR_Zahl)                                            ' Gltigkeitsprfung bestanden, d.h. Zahl dem Zahlenfeld zuweisen
Next x

' Zahlen mit Bubblesort sortieren lassen

For x = 1 To VR_max_Zahlen - 1                  ' uere Schleife = (max. Anzahl der Zahlen-1, da Zahlen "blasenweise" nach oben steigen und im Worst Case hchste Zahl am Anfang der Zahlenliste stehen knnte)
    BL_Tauschflag = False                       ' Tauschflag wieder auf false setzen, d.h. davon ausgehen, dass bereits sortiert ist
    For y = 1 To VR_max_Zahlen - 1              ' letzte Zahl wird ja mit +1 verglichen, daher alle Zahlen -1 durchlaufen
        If DB_ZAHLEN(y) > DB_ZAHLEN(y + 1) Then ' Vergleich mit nchsthherer Zahl durchfhren
           LG_Puffer = DB_ZAHLEN(y + 1)         ' zu tauschende Zahl zwischenspeichern
           DB_ZAHLEN(y + 1) = DB_ZAHLEN(y)      ' nchsthhere Zahl mit vorhergehender Tauschen
           DB_ZAHLEN(y) = LG_Puffer             ' vorhergehender Zahl zwischengespeicherte Zahl (=nchsthhere) zuweisen
           BL_Tauschflag = True                 ' Tausch vermerken
        End If
    Next y
    If BL_Tauschflag = False Then               ' blieb Tauschflag brav auf "flase"
       Exit For                                 ' ja, dann ist Sortierung beendet, damit die Schleife und Ausgabe kann eingeleitet werden
    End If
Next x

S_Ausgabestring = "" ' Ausgabestring initialisieren

For x = 1 To VR_max_Zahlen                                          ' alle Zahlen mssen aufbereitet werden
    If x = val(VR_max_Zahlen) Then                                  ' letztes Komma fr Ausgabe weglassen
       S_Ausgabestring = S_Ausgabestring + Str(DB_ZAHLEN(x))        ' String dafr ohne Komma aufbereiten
    Else
       S_Ausgabestring = S_Ausgabestring + Str(DB_ZAHLEN(x)) + ", " ' ansonsten String mit Komma aufbereiten
    End If
Next x

' fertigen String ausgeben lassen und letzte Zahl davon explizit als "das Maximum" prsentieren
MsgBox ("Danke, Ihre Zahlen in ansteigender Reihenfolge lauten: " & S_Ausgabestring + vbLf + vbLf + "Das Maximum ist:" + Str(DB_ZAHLEN(VR_max_Zahlen)))

' Errorhandler berspringen

GoTo regular_end

end_prg:

MsgBox ("Fehlerhafte Eingabe - Sortierroutinen-Programm wird abgebrochen!")

regular_end:

' Errorhandler wieder aufheben

On Error GoTo 0

End Sub

Sub AutoOpen() ' d. Sub ruft lediglich Maximumsort auf und TERMINIERT nach Wunsch das Programm...
 Do
  Call Maximumsort
 Loop Until MsgBox("Wollen Sie nochmal Zahlen sortieren und sich die grte davon ausgeben lassen?", vbYesNo, "Programmbeendigungsabfrage...") <> vbYes
End Sub

