1.9k Aufrufe
Gefragt in Tabellenkalkulation von fedjo Experte (2.2k Punkte)
Hallo Excelfreunde,
gibt es eine Möglichkeit mit QuickSort auch leere Zellen einer Spalte mit zu sortieren?

Gruß
fedjo

Private Sub UserForm_Activate()
Dim objDictionary As Object
Dim varBereich As Variant
Dim arrDaten As Variant
Dim loZaehler As Long
Set objDictionary = CreateObject("Scripting.Dictionary")
varBereich = Range("C4", Range("C4").End(xlDown))
For loZaehler = LBound(varBereich) To UBound(varBereich)
' Eintrag wird nur übernommen wenn er im DictionaryObject noch nicht enthalten ist
objDictionary(varBereich(loZaehler, 1)) = 0
Next loZaehler
arrDaten = objDictionary.keys
QuickSort arrDaten
ComboBox1.List = arrDaten
Set objDictionary = Nothing
End Sub

Sub QuickSort(ByRef VA_Array, Optional V_Low1, Optional V_High1)
' http://www.herber.de/forum/archiv/108to112/t109556.htm
On Error Resume Next
Dim V_Low2 As Long, V_High2 As Long
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 <= V_High2)
While (VA_Array(V_Low2) < V_Val1 And _
V_Low2 < V_High1)
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_High2) Then
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) Then Call _
QuickSort(VA_Array, V_Low2, V_High1)
End Sub

4 Antworten

0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Bitte? Wie meinst Du das?
Wuerdest Du leere Zellen mit aufsammeln, wuerdest Du sie nat. auch mit sortieren. Da hier wohl (auf den ersten Blick) nur aufsteigend sortiert wird, wuerden sie in der ComboBox dann ganz oben stehen.

Warum passiert das nun nicht? mindestens zweierlei spricht dagegen:
[*] der Bereich den Du sortierst, wird mMn falsch ermittelt (mit varBereich = Range("C4", Range("C4").End(xlDown)) erfasst Du die zusammenhaengenden Werte der Zellen abwaerts (ausgehend von C4, wenn also in C4 und C5 Werte stehen (C6 sei leer und C7 soll einen Wert haben) dann wuerden nur die Werte aus C4 und C5 sortiert werden.
[*]der "Umweg" ueber das Dictionary-Object . Selbst wenn Du mehrere leere Zellen aufsammeln wuerdest, wuerde das DictObj nur einen einzelnen leeren Wert enthalten, der ins zu sortierende Array einfliessen wuerde.

Da aus diesem Codeschnippsel und Deiner Frage so nicht ersichtlich ist, was Du genau vorhast, waere eine Beispieldatei oder auch eine naehere Erlaeuterung des eigtl. Problems evtl. hilfreich.

Cu
TheBlackBird ®
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo TheBlackBird ,
Du hast es schon richtig erkannt:
Werte der Zellen abwaerts (ausgehend von C4, wenn also in C4 und C5 Werte stehen (C6 sei leer und C7 soll einen Wert haben) dann wuerden nur die Werte aus C4 und C5 sortiert werden.

Ich möchte nur Werte (auch C7) in die ComboBox sortiert einfügen, auch wenn dazwischen leere Zellen sind.

Gruß
fedjo
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Fedjo,

deine Fragestellung ist falsch - es geht nicht darum leere Zellen mit zu sortieren sondern die letzte belegte Zelle der Spalte zu ermitteln, wenn Leerzellen vorkommen können

varBereich = Range(Cells(4, 3), Cells(IIf(IsEmpty(Cells(Rows.Count, 3)), Cells(Rows.Count, 3).End(xlUp).Row, Rows.Count), 3))

Bis später,
Karin
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo Karin,
stimmt die Frage hatte ich wohl falsch gestellt.
Deine Antwort mit dem neuen varBereich ist genau das was ich eigentlich wollte. Funktioniert super.

Danke
Schönes Wochenende

Gruß
fedjo
...