QuickSort ... kleines Problem mit ComboBox.
05.02.2007 22:14:32
proxima05
über den folgenden Code sortiere ich ein Daten-Array und schreibe es alphabetisch in eine ComboBox (Anzeige dort dreispaltig). Jetzt habe ich aber zwei unschöne Nebeneffekte festgestellt (denen ich bei einspaltiger Darstellung Herr geworden bin, bisher bei mehrspaltiger D. nicht so richtig):
[1] In die Liste der ComboBox werden auch leere Datenfelder aus dem Array übertragen und merkwürdigerweise oberhalb der sortierten Daten angezeigt. Ich hätte gerne, dass die leeren Datenfelder gar nicht erst in die ComboBox übertragen werden.
[2] Unter die alphabetisch sortierten Daten werden ein weiteres Mal diejenigen alphabetisch sortiert angehängt, die in der ersten Spalte des Array stehen (Spalte zwei und drei werden in der Anzeige aber unterschlagen). Woran liegt das und wie kann man es verhindern?
Hier der Code:
Private Sub Userform_Activate()
Dim i As Integer
Dim varArrav
With Worksheets("Cash Flow")
varArrav = .Range("AF19:AH33")
UserForm3.ComboBox1.ColumnCount = 3
UserForm3.ComboBox1.ColumnWidths = "40 pt;50 pt;40 pt"
ComboBox1.List = varArrav
ComboBox1.ListIndex = 0
End With
Call QuickSort(1, UBound(varArrav), varArrav)
ComboBox1.List = varArrav
'schreiben (Daran liegt es wahrscheinlich, dass mehrfach, inkl. Leerzeilen
'in die ComboBox geschrieben wird; in einer einspaltigen Darstellung klappte
'es jedoch)
For i = LBound(varArrav) To UBound(varArrav)
If varArrav(i, 1) <> "" Then
UserForm3.ComboBox1.AddItem (varArrav(i, 1))
End If
Next i
End Sub
Private Sub QuickSort(lngUgrenze As Long, lngOgrenze As Long, varFeld)
Dim lngIndex1 As Long, lngIndex2 As Long, varElement As Variant, varSpeicher As Variant, intSpalte As Integer
lngIndex1 = lngUgrenze
lngIndex2 = lngOgrenze
varSpeicher = varFeld(((lngUgrenze + lngOgrenze) / 2) \ 1, 1) 'der Wert hinter dem Komma ist die Spalte die sortiert wird
Do
Do While varFeld(lngIndex1, 1) < varSpeicher 'der Wert hinter dem Komma ist die Spalte die sortiert wird
lngIndex1 = lngIndex1 + 1
Loop
Do While varSpeicher < varFeld(lngIndex2, 1) 'der Wert hinter dem Komma ist die Spalte die sortiert wird
lngIndex2 = lngIndex2 - 1
Loop
If lngIndex1 <= lngIndex2 Then
For intSpalte = 1 To 3 '3 Spalten übertragen
varElement = varFeld(lngIndex1, intSpalte)
varFeld(lngIndex1, intSpalte) = varFeld(lngIndex2, intSpalte)
varFeld(lngIndex2, intSpalte) = varElement
Next
lngIndex1 = lngIndex1 + 1
lngIndex2 = lngIndex2 - 1
End If
Loop Until lngIndex1 > lngIndex2
If lngUgrenze < lngIndex2 Then Call QuickSort(lngUgrenze, lngIndex2, varFeld)
If lngIndex1 < lngOgrenze Then Call QuickSort(lngIndex1, lngOgrenze, varFeld)
End Sub
Wäre klasse, wenn da jemand helfen könnte.
Danke & Gruß
Ralph