Clever-Excel-Forum

Normale Version: VBA - Zahlen sortieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Guten Morgen Zusammen,

zurzeit probiere ich mich etwas darin aus, ein paar Sachen in VBA zu erstellen.
Mein Problem ist nun, dass ich ein "Programm" erstellen wollte, wo man drei Zahlen eingeben kann und diese dann immer direkt sortiert werden nach Min, Max und Mittelwert.
Dazu habe ich schon in Betracht gezogen es mit If Funktionen zu erstellen, halte dieses aber nicht für sinnvoll da es ansonsten ein ziemlich langer Text werden würde.
Hätte einer von euch dazu eine Idee?
Moin!
Eine Textbox enthält erstaunlicherweise Text.
Auch Ziffern sind erstmal Text.
Die Excel-Funktionen MIN() MAX() und MITTELWERT() ignorieren Text!
Daher musst Du die Textzahlen erst in echte Zahlen umwandeln.

If IsNumeric(Text) Then Text = CDbl(Text)

Gruß Ralf
gelöscht, war zu langsam.
Und noch etwas zum Programmierstil:
Hier bietet es sich an, der Prozedur gleich Übergabeparameter mitzugeben.
Mal als simples Beispiel mit Textzahlen:

Sub Test()
Dim txtA$, txtB$, txtC$
txtA = "15"
txtB = "10"
txtC = "9"
Call Werte(CDbl(txtA), CDbl(txtB), CDbl(txtC))
End Sub

Private Sub Werte(A#, B#, C#)
With WorksheetFunction
  Debug.Print .Min(A, B, C)
  Debug.Print .Max(A, B, C)
  Debug.Print .Average(A, B, C)
End With
End Sub

Ergibt im Direktfenster:
Code:
9
15
11,3333333333333
Vielen Dank schon mal :)
Komme mit der Funktion leider noch nicht wirklich weiter :/
Dass mein 
If IsNumeric(Text) Then Text = CDbl(Text)
Pseudo-Code ist, den Du natürlich anpassen musst, sollte logisch sein?

Betrachte mein nachgeschobenes Beispiel.
Müsste selbsterklärend sein.
Code:
Sub M_snb()
  sn = Array("12", "34", "07")
  For j = 0 To UBound(sn)
      sn(j) = --sn(j)
  Next
 
  With Application
     MsgBox Join(Array(.Min(sn), .Large(sn, 2), .Max(sn)), vbLf)
  End With
End Sub
Hallo,

ich habe dir in der beiliegenden Excel-Datei eine UserForm eingefügt, die über den blauen Button "Aufruf des Sortierformulars" im Arbeitsblatt "Tabelle1" aufgerufen werden kann.
Nach Eingabe der 3 numerischen Variablen A,B,C kann man auf den Beschriftungstext "Sortiert" klicken, worauf diese 3 Variablen unterhalb sortiert ausgegeben werden in den 3 Textfeldern "Kleinst", "Mittel" und "Groß".
Das verwendete Sortierverfahren ist der Bubble-Sort - angesichts der Größe des zu sortierenden Arrays ist es das einfachste Verfahren.

Nachfolgend auch nochmals der VBA-Code:
Code:
Option Explicit
'
'Wird ausgeführt nach Klick aufs Formular
'
Private Sub BeimSortierKlick()
  Dim A As Double, B As Double, C As Double
  Dim AR As Variant
 
  On Error GoTo Err_UF_Click
  A = CDbl(Me.txtBoxA.Value)
  B = CDbl(txtBoxB.Value)
  C = CDbl(Me.txtBoxC.Value)
 
  AR = Array(A, B, C)
  Call BubbleSort(AR)
 
End_UF_Click:
  Me.txtBoxKleinst.Value = AR(0)
  Me.txtBoxMittel.Value = AR(1)
  Me.txtBoxGroß.Value = AR(2)
 
  Exit Sub
 
Err_UF_Click:
  AR = Array("", "", "")
  MsgBox Prompt:="Fehler " & Err.Number & vbNewLine & _
                "(" & Err.Description & ")", _
        Buttons:=vbCritical, _
        Title:="Fehler Datenumwandlung"
  Resume End_UF_Click
End Sub
'
'Wird ausgeführt nach Klick auf den Label "Sortiert"
'
Private Sub lblSortiert_Click()
  BeimSortierKlick
End Sub
'
'Wird ausgeführt nach Klick auf den Button "Schließen"
'
Private Sub cmdBtnSchließen_Click()
  Me.Hide
End Sub
'
'Sortierverfahren: Bubble-Sort: Sortiert Array AL() aufsteigend
'
Private Sub BubbleSort(ByRef AL As Variant)
  Dim I As Integer, II As Integer
  Dim Z As Variant
 
  For I = 0 To UBound(AL) - 1
   
    For II = UBound(AL) To I + 1 Step -1
      If AL(II - 1) > AL(II) Then
      'Vertausche Inhalte von AL(II-1) und AL(II):
        Z = AL(II - 1): AL(II - 1) = AL(II): AL(II) = Z
      End If
    Next II
 
  Next I
 
End Sub
Uiuiui!
BubbleSort für so etwas Profanes sind die berühmten Kanonen auf Spatzen.

@JanScholz:
Aufgrund der Tatsache, dass Du Dich ein wenig an VBA probieren willst, habe ich Dir ein paar Snippets angeboten.
Allerdings empfände ich es als viel sinnvoller, dass Du Dich mit einfachen Excel-Funktionen auseinander setzt.
Wenn es wirklich eine sortierte Ausgabe (und nicht der von mir angenommene und von Dir auch genannte Mittelwert) sein soll,
dann gibt es in Deinem Excel 365 =SORTIEREN() (bekannte Anzahl von Zellen) oder =KKLEINSTE(Spalte;SEQUENZ(ANZAHL(Spalte)))

ABC
11411
21944
3477
471313
511414
6131919
Formeln der Tabelle
ZelleFormel
B1=SORTIEREN(A1:A6)
C1=KKLEINSTE(A:A;SEQUENZ(ANZAHL(A:A)))