Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA - Zahlen sortieren
#1
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?


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#2
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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#3
gelöscht, war zu langsam.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#4
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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#5
Vielen Dank schon mal :)
Komme mit der Funktion leider noch nicht wirklich weiter :/


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#6
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.
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#7
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#8
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


Angehängte Dateien
.xlsm   JanScholz_UserForm.xlsm (Größe: 22,17 KB / Downloads: 1)
Mit lieben Grüßen
Anton.

Windows 10 64bit
Office365 32bit
Antworten Top
#9
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)))
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste