Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ComboBox sortieren .... Frage zu QuickSort

Forumthread: ComboBox sortieren .... Frage zu QuickSort

ComboBox sortieren .... Frage zu QuickSort
31.10.2006 21:38:23
proxima05
Hallo, ich habe mal wieder eine Frage, auf ein möglicherweise lapidares Problem (die Recherche im Netz hat aber anderes ergeben).
Es geht um das aufsteigende Sortieren des Inhalts einer ComboBox in einem UF. Über den folgenden Code fülle ich eine ComboBox, was auch trefflich funktioniert (dank Unterstützung von hier).
========================================

Private Sub Type_of_Bond_Enter()
Type_of_BondFuellen Type_of_Bond, ActiveWorkbook.Worksheets("Cash Flow").Range("AC19:AC28")
End Sub

========================================
========================================

Private Sub Type_of_BondFuellen(CBox As ComboBox, Bereich As Range)
'Laden der Daten aus dem Bereich in die ComboBox, leere Zellen werden übersprungen
With CBox
.Clear
For Each Zelle In Bereich
If Zelle.Value <> "" Then
.AddItem (Zelle.Value)
End If
Next Zelle
End With
End Sub

========================================
Da die Listeinträge in der Range nicht alphabetisch oder sonst irgendwie sortiert sind (meistens ist es Text), erscheinen sie auch unsortiert in der ComboBox. Bei der Recherche bin ich dann auf die QuickSort-Funktion gestossen. Über diese würde ich die Liste in einer Array-Variablen sortieren lassen, da die Tabelle selbst nicht sortiert werden soll.
Das Array würde ich mit der folgenden Routine sortieren:
**************************************************
Sub SortArray()
Dim I As Variant
For I = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
myArray(I) = Worksheets("Cash Flow").Range("AC19:AC28")
Next I
Call QuickSort(myArray)
For I = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Worksheets("Cash Flow").Range("AC19:AC28") = myArray(I)
Next I
End Sub
**************************************************
.... und hier die Routine für Quicksort
**************************************************
Sub QuickSort(VA_array, Optional V_Low1, Optional V_high1)
On Error Resume Next
Dim V_Low2, V_high2, V_loop As Integer
Dim V_val1, V_val2 As Variant
If IsMissing(V_Low1) Then
V_Low1 = LBound(VA_array, 1)
End If
If IsMissing(V_high1) Then
V_high1 = UBound(VA_array, 1)
End If
V_Low2 = V_Low1
V_high2 = V_high1
V_val1 = VA_array((V_Low1 + V_high1) / 2)
While (V_Low2 While (VA_array(V_Low2) V_Low2 = V_Low2 + 1
Wend
While (VA_array(V_high2) > V_val1 And V_high2 > V_Low1)
V_high2 = V_high2 - 1
Wend
If (V_Low2 V_val2 = VA_array(V_Low2)
VA_array(V_Low2) = VA_array(V_high2)
VA_array(V_high2) = V_val2
V_Low2 = V_Low2 + 1
V_high2 = V_high2 - 1
End If
Wend
If (V_high2 > V_Low1) Then Call QuickSort(VA_array, V_Low1,
V_high2)
If (V_Low2 V_high1)
End Sub
**************************************************
Kann das so funktionieren und wo im VBA-Code schreibe ich das hin. Innerhalb der Routinen für die jeweilige ComboBox?
Hoffe mir kann da jemand helfen.
Allerbesten Dank.
Ralph
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ComboBox sortieren .... Frage zu QuickSort
31.10.2006 22:18:46
MichaV
Hallo,
eine Möglichkeit ist, die Daten auf einen Schlag einzulesen, dann zu sortieren, und dann die nicht-leeren nach und nach in die Combobox zu schreiben.
Nach diesem Prinzip (und mit einem funktionierenden Quick-Sort)

Option Explicit
Private Sub CommandButton1_Click()
Dim Bereich As Range
Dim Zelle As Range
Set Bereich = Range("A1:A14")
Dim Daten As Variant
With ComboBox1
.Clear
'Daten holen
Daten = Bereich
'sortieren
Call QuickSort_Feld(Daten, LBound(Daten, 1), UBound(Daten, 1), False)
'schreiben
For Each Zelle In Bereich
If Zelle.Value <> "" Then
.AddItem (Zelle.Value)
End If
Next Zelle
End With
End Sub
Private Sub QuickSort_Feld(DasFeld, StartUnten, EndeOben, Absteigend As Boolean)
'QuickSort Standard
'hptt://www.online-excel.de/excel/singsel_vba.php?f=24  , bissel angepasst von mir
Dim iUnten As Long, iOben, iMitte, y
iUnten = StartUnten
iOben = EndeOben
iMitte = DasFeld((StartUnten + EndeOben) / 2, 1)
While (iUnten <= iOben)
If Not Absteigend Then
While (DasFeld(iUnten, 1) < iMitte And iUnten < EndeOben)
iUnten = iUnten + 1
Wend
While (iMitte < DasFeld(iOben, 1) And iOben > StartUnten)
iOben = iOben - 1
Wend
Else
While (DasFeld(iUnten, 1) > iMitte And iUnten < EndeOben)
iUnten = iUnten + 1
Wend
While (iMitte > DasFeld(iOben, 1) And iOben > StartUnten)
iOben = iOben - 1
Wend
End If
If (iUnten <= iOben) Then
y = DasFeld(iUnten, 1)
DasFeld(iUnten, 1) = DasFeld(iOben, 1)
DasFeld(iOben, 1) = y
iUnten = iUnten + 1
iOben = iOben - 1
End If
Wend
If (StartUnten < iOben) Then Call QuickSort_Feld(DasFeld, StartUnten, iOben, Absteigend)
If (iUnten < EndeOben) Then Call QuickSort_Feld(DasFeld, iUnten, EndeOben, Absteigend)
End Sub

Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
@ Micha
31.10.2006 23:31:12
Nepumuk
Hallo Micha,
irgendwie nicht ganz fertig würde ich sagen.
Daten in ein Array einlesen OK.
Daten im Array sortieren auch OK.
Aber dann die unsortierten Daten doch aus der Tabelle lesen ?
Gruß
Nepumuk
Huch
31.10.2006 23:35:26
MichaV
Hallo,
danke für den Hinweis ;o)
Das hier sollte es dann aber sein:

Private Sub CommandButton1_Click()
Dim Bereich As Range
Dim Zelle As Range
Set Bereich = Range("A1:A14")
Dim i As Integer
Dim Daten As Variant
With ComboBox1
.Clear
'Daten holen
Daten = Bereich
'sortieren
Call QuickSort_Feld(Daten, LBound(Daten, 1), UBound(Daten, 1), False)
'schreiben
For i = LBound(Daten) To UBound(Daten)
If Daten(i, 1) <> "" Then
.AddItem (Daten(i, 1))
End If
Next i
End With
End Sub

Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: ComboBox sortieren .... Frage zu QuickSort
01.11.2006 19:50:30
proxima05
Hallo ihr beiden,
ich habe die beiden Routinen jetzt mal eingebaut. Die erste Routine wird bei "Enter" der ComboBox1 abgearbeitet, was auch trefflich funktioniert.

Private Sub ComboBox1_Enter()
ComboboxFuellen ComboBox1, ActiveWorkbook.Worksheets("Cash Flow").Range("AA2:AA16")
'Einlesen, sortieren und schreiben der Daten in die ComboBox
Dim Bereich As Range
Dim Zelle As Range
Set Bereich = Range("AA2:AA16")
Dim i As Integer
Dim Daten As Variant
With ComboBox1
.Clear
'Daten holen
Daten = Bereich
'sortieren
Call QuickSort_Feld(Daten, LBound(Daten, 1), UBound(Daten, 1), False)
'schreiben
For i = LBound(Daten) To UBound(Daten)
If Daten(i, 1) <> "" Then
.AddItem (Daten(i, 1))
End If
Next i
End With
End Sub

Die QuickSort-Routine ist als separater Routinen-Abschnitt angelegt, wie von Nepumuk korrigiert beschrieben.
Wenn ich jetzt einen neuen Eintrag in die obige Range eintrage, dann erscheint dieser auch alphabetisch sortiert in der ComboBox1. Lösche ich diesen Eintrag jedoch aus der Range, dann erscheint er immer noch in der ComboBox1 gelistet.
Woran kann das liegen?
Danke für einen Tipp.
Gruß
Ralph
Anzeige
AW: ComboBox sortieren .... Frage zu QuickSort
01.11.2006 20:00:22
proxima
.... noch als Anmerkung.
Ich habe in dem beschriebenen UF noch eine CheckBox .... wenn ich die anklicke und dann auf den OK-Knopf drücke, schliesst sich dieses UF ... wenn ich dieses dann wieder öffne, ist die ComboBox1 nur mit dem noch vorhandenen Einträgen gelistet.
Hier mal der Code für den OK-Button:

Private Sub OK_Click()
If CheckBox1.Value = True And ComboBox1.Value = "" Then
Unload UserForm2
UserForm1.Show
ElseIf CheckBox1.Value = True And UserForm2.ComboBox1.Value <> "" Then
'an dieser Stelle reagiere ich nicht auf den ListIndex sondern auf einen Wert
i = MsgBox("You can only do one thing at a time! .... please select!", vbOKOnly, "Warning")
If i = 1 Then
UserForm2.CheckBox1.Value = False
UserForm2.ComboBox1.Value = ""
ComboBox1.SetFocus
End If
End If
End Sub

Danke für Unterstützung.
Gruß
Ralph
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige