# Collection sortieren



## Yoah (11. Januar 2005)

Hi @ all!

Bin hier neu und habe direkt mal eine gezielte Frage an euch!

Wie sortiere ich eine Collection?
In dieser Collection habe ich eine ganze Menge Wörter abgelegt,
nun möchte ich die Collection sortieren.


```
Sub Sort()
Dim Tmp 
Dim i, j   
 For i = 1 To WordList.count
    For j = WordList.count To (i + 1) Step -1
        If WordList.Item(i) > WordList.Item(j) Then
            Tmp = WordList.Item(i)
            WordList.Item(i) = WordList.Item(j)
            WordList.Item(j) = Tmp
        End If
     Next j
 Next i
End Sub
```

So sieht mein Code im Moment aus!
Nur gibt er mir bei der Zeile *WordList.Item(i) = WordList.Item(j)*
eine Fehlermeldung aus, die lautet: Run-Time-Error '424' Object required
Ich hoffe ihr könnt mir da weidter helfen!

Achja, noch was, wenn ich schon mal dabei bin:
Kann man im gleichen Zug, doppelte Einträge löschen?

ThanX!


----------



## dignsag (11. Januar 2005)

> ```
> Sub Sort()
> Dim Tmp
> Dim i, j
> ...


 
 Du musst in deine If Funktion noch eine zweite bedingung einbauen! Sonst prüft er ja auch ob z.B. WordList.Item(5) gleich WordList.Item(5) ist! Verstehst du!

   Du musst also noch 
	
	
	



```
and i <> j
```
 anhängen!

  das ganze sähe dann so aus:


```
Sub Sort()
    Dim Tmp 
    Dim i, j   
     For i = 1 To WordList.count
        For j = WordList.count To (i + 1) Step -1
            If WordList.Item(i) > WordList.Item(j) and i <> j Then
                Tmp = WordList.Item(i)
                WordList.Item(i) = WordList.Item(j)
                WordList.Item(j) = Tmp
            End If
         Next j
     Next i
    End Sub
```
 
 P.S.: Ist das Absicht das du für deine Variablen keine Datentypen vergibst?


----------



## Yoah (11. Januar 2005)

Hi !

Ich habe es mal so geändert, wie du gesagt hast, 
allerdings ist das noch nicht ganz das Problem.
WordList ist eine Collection und irgendwie nimmt er
den = operator nicht, keine Ahnung, warum.
Hilf mir doch nochmal auf die Sprünge!


----------



## dignsag (11. Januar 2005)

Nun ja ich weiß nicht ganz was du damit meinst, dass das  eine Collection sei.

 Mein einziger Vorschlag wäre vielleicht mal die gesamte WordList in ein Array zu schreiben und anstatt der WordList selbst das Array in den Code einzubinden! Damit sollte er keine Probleme machen da er schließlich keine Probleme hat den einen Bestandteil in die tmp Variable zu schreiben. Ansonsten fällt mich nichts dazu ein!


----------



## dignsag (11. Januar 2005)

Ach mir ist doch noch was eingefallen! Anstatt in der 2. For-Schleife die drei Zeilen zu schreiben, schreib doch einfach mal eine tauschen-Funktion! Sieht dann in etwa so aus:


```
Public Sub tauschen(ByRef Expression1 As Variant, ByRef Expression2 As Variant)
 	Dim merken As Variant
 
 	merken = Expression1
 	Expression1 = Expression2
 	Expression2 = merken
 
 End Sub
```


----------



## fenriz (4. September 2007)

Private Sub SortCollection()

    Dim col As New Collection
    Dim item1 As Variant
    Dim item2 As Variant

    Dim i As Long, j As Long

    col.Add "test3"
    col.Add "test1"
    col.Add "test2"

    For i = 1 To col.Count
        For j = i + 1 To col.Count

            item1 = col.Item(i)
            item2 = col.Item(j)

            If StrComp(item1, item2, vbTextCompare) = 1 Then

                col.Add item2, , i
                col.Remove j + 1

            End If
        Next j
    Next i

    Debug.Print "ok"

End Sub


----------



## odCaplan (11. September 2007)

Hallo,

Eine mögliche Alternativ wäre auch, die Werte in ein ListBox zu kopieren und dort zu sortieren.

' ausfüllen
lbListe.additem "test 2"
lbListe.additem "test 1"
lbListe.additem "test 3"

' sortieren
lbListe.Sorted = True

' lesen
for i = 1 to lbListe.ListCount -1
  debug.print lbListe.List(i)
next i


----------

