Soa ich hab mal versucht eine Lösung zusammen zu suchen:
Public Sub sort_allComboboxes()
Dim box As MSForms.Combobox
Dim idx As Integer
For idx = 1 To frmFilter.FilterCol.Count
Set box = frmFilter.FilterCol.Item(idx).Filter
sort_ComboBox (box)
Set box = frmFilter.FilterCol.Item(idx).Options
sort_ComboBox (box)
Next idx
End Sub
' copied from: https://msdn.microsoft.com/de-ch/library/bb979305.aspx at 21.4.17 10:20:00
Public Sub QuickSort( _
ByRef ArrayToSort As Variant, _
ByVal Low As Long, _
ByVal High As Long)
Dim vPartition As Variant, vTemp As Variant
Dim i As Long, j As Long
If Low > High Then Exit Sub ' Rekursions-Abbruchbedingung
' Ermittlung des Mittenelements zur Aufteilung in zwei Teilfelder:
vPartition = ArrayToSort((Low + High) \ 2)
' Indizes i und j initial auf die äußeren Grenzen des Feldes setzen:
i = Low: j = High
Do
' Von links nach rechts das linke Teilfeld durchsuchen:
Do While ArrayToSort(i) < vPartition
i = i + 1
Loop
' Von rechts nach links das rechte Teilfeld durchsuchen:
Do While ArrayToSort(j) > vPartition
j = j - 1
Loop
If i <= j Then
' Die beiden gefundenen, falsch einsortierten Elemente
austauschen:
vTemp = ArrayToSort(j)
ArrayToSort(j) = ArrayToSort(i)
ArrayToSort(i) = vTemp
i = i + 1
j = j - 1
End If
Loop Until i > j ' Überschneidung der Indizes
' Rekursive Sortierung der ausgewählten Teilfelder. Um die
' Rekursionstiefe zu optimieren, wird (sofern die Teilfelder
' nicht identisch groß sind) zuerst das kleinere
' Teilfeld rekursiv sortiert.
If (j - Low) < (High - i) Then
QuickSort ArrayToSort, Low, j
QuickSort ArrayToSort, i, High
Elsea
QuickSort ArrayToSort, i, High
QuickSort ArrayToSort, Low, j
End If
End Sub
Sub sort_ComboBox(box As MSForms.Combobox)
Dim l() As String
Dim value As String
Dim idx As Integer
ReDim l(box.ListCount) As String
Set l = box.List
Call QuickSort(l, 1, 20)
Do While box.ListCount > 0
box.RemoveItem (0)
Loop
For idx = LBound(l) To UBound(l)
box.AddItem (l(idx))
Next idx
box.value = value
End Sub
Das sind drei Routinen die folgendes machen: sort_allComboBoxes looped durch alle Comboboxen in einer userform und ruft sort_combobox auf. Sort_combobox sortiert eine Combobox indem sie die .list eigenschaft aufruft und sie in ein Array speichert und dann mit quicksort sortiert wird. Quicksort sortiert das array. Nach dme sortieren werden alle Elemente aus der Combobox gelöscht und wieder mit dem richtig sortierten Array befüllt. der Ausgewählte Wert wird gespeichert und wieder eingegeben nachdem die Combobox wieder befüllt ist.
Jetzt gibt es ein Problem bei dem Aufruf der sort_combobox routine Fehler 424 Objekt erforderlich. Die Combobox ist eine MSForms.ComboBox und sollte deshalb den Typ erfüllen. Die ComboBox existiert und die Zuweisung set box=frmFilter.DefaultFilter funktioniert. Box ist also nicht Nothing. Hat einer eine Idee was das Problem sein könnte?
Grüsse
|