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

Forumthread: Werte in Array aufsteigend sortieren

Werte in Array aufsteigend sortieren
08.04.2020 18:09:44
Thorsten
Hallo liebe Forumsmitglieder,
Ich suche nach einer Methode, mit der ich meinen Array sortieren kann.
Aktuell liest mein Code eine Liste mit Duplikaten aus und gibt die Liste in einer neuen Spalte ohne Duplikate wieder aus.
Vor der Ausgabe sollte der Array allerdings bestenfalls aufsteigend sortiert sein. Ich arbeite mich gerade in VBA ein, also fehlt ein wenig das Verständnis.
Viele Grüße
Thorsten
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte in Array aufsteigend sortieren
08.04.2020 18:13:08
Thorsten
Anbei der Code, den ich momentan verwende.
Der Array Laenge wäre zu sortieren. Optimal wäre auch, wenn der Array keine fest vorgegebene Länge hätte. (Ich glaube hier ist er auf 500 festgeschrieben)
Viele Grüße und vielen Dank
Thorsten
' Variablen deklarieren
Dim s As Integer
Dim t As Integer
Dim r As Integer
Dim rr As Integer
Dim we As Integer
Dim Laenge(5000) As Variant
' Werte in Variablen einlesen
For s = 5 To Range("I65536").End(xlUp).Row  ' Schleifenstart, gehe von Zeile 2 bis letzte Zeile
we = 0                                  ' Temporäre Variable auf null setzen
For t = 5 To s                          ' Schleifenstart, gehe von Zeile 2 bis aktuelle  _
Zelle
If Laenge(t) = Cells(s, 9) Then we = 1 ' Wenn Wert aus Variable gleich aktuelle Zelle  _
dann _
temporäre Variable gleich 1
Next t                                  ' Wendepunkt für Schleife
If we = 0 Then Laenge(t) = Cells(s, 9)     ' Wenn temp. Variable gleich null dann Wert aus  _
_
aktueller Zelle in Variable
Next s                                      ' Wendepunkt für Schleife
' Werte in neuer Spalte ausgeben
For r = 1 To t                              ' Schleifenstart
If Laenge(r)  "" Then                    ' Wenn Variable einen Inhalt hat, dann ...
rr = rr + 1                         ' ... Zähler für Zelle im Ausgabebereich plus 1
Cells(rr + 5, 15) = Laenge(r)             ' ... Variable in Zelle schreiben
End If                                  ' Ende der Bedingung
Next r                                      ' Wendepunkt für Schleife

Anzeige
AW: Werte in Array aufsteigend sortieren
08.04.2020 18:29:19
Daniel
Hi
Bei Basiskenntnissen in VBA wäre es am einfachsten, das Array in eine Spalte zu schreiben und dort mit der Excel-Menü-Funktion "Sortieren" zu sortieren.
Ansonsten müsstest du die Sortierfunktion nachprogrammieren, was nicht so ganz einfach ist, wenns ein schneller Code sein soll.
Beispielcodes für Quicksort als Sortiermethode sollten sich finden lassen, aber auch die muss man erstmal verstehen und adaptieren.
Gruß Daniel
Anzeige
AW: Werte in Array aufsteigend sortieren
08.04.2020 21:27:56
Thorsten
Hallo Daniel,
Das wird leider nicht gehen, da ich das für mehrere Hundert dieser Arrays machen müsste. Eine Automatisierung wäre tatsächlich notwendig, weil mir der anschließende Code mit den sortierten Arrays als Überschriften eine Matrix aufspannt. Ich habe versucht, dass mit den Sortiercodes hinzubekommen, hatte aber immer Probleme, den Array richtig zu übergeben.
Anzeige
AW: Werte in Array aufsteigend sortieren
08.04.2020 21:47:36
Daniel
Man kann die Sortierfunktion von Excel auch automatisiert innerhalb eines Makros verwenden.
AW: Werte in Array aufsteigend sortieren
09.04.2020 00:47:52
volti
Hallo Thorsten,
hier mal eine Idee, ein einstelliges Array über eine Collection aufsteigend zu sortieren.
Die Werte der Spalte A werden sortiert und um die Dublikate bereinigt in die Spalte B eingetragen.
Vielleicht hilft es ja...

Option Explicit
Sub TestBereichSortierenUndBereinigen()
 Dim vArr() As Variant, sArr() As String
 vArr = Range("A1:A" & Range("A65536").End(xlUp).Row).Value
 Range("B1:B" & Range("A65536").End(xlUp).Row).ClearContents
 sArr = Split(ArraySort(vArr), ",")
 Cells(1, "B").Resize(UBound(sArr), 1) = Application.Transpose(sArr)
End Sub
Function ArraySort(vArr As Variant) As String
'Sortieren eines einstelligen Arrays über eine Collection
 Dim i As Long, oCol As New Collection
 For i = 1 To UBound(vArr)
    CollectionAddItem oCol, vArr(i, 1)
 Next i
 For i = 1 To oCol.Count
    ArraySort = ArraySort & oCol.Item(i) & ","
 Next i
End Function
Function CollectionAddItem(oCol As Collection, ByVal sItem As String, Optional iPos As Integer, Optional ByVal vKey As Variant) As Long
'Function fügt einen Eintrag sortiert in eine Collectionsammlung ein
  Dim nStart As Long, nEnd As Long
  If Trim$(sItem) = "" Then Exit Function
  With oCol
    If iPos <> 0 Then .Add sItem, vKey, 1: Exit Function
    If .Count < 1 Then .Add sItem, vKey:  Exit Function         'wenn Collection-Objekt noch leer ist
'Neuen Eintrag mit 1. Eintrag vergleichen
    If .Item(1) > sItem Then
       .Add sItem, vKey, 1                                      'an 1. Position einfügen
'jetzt mit letzten Eintrag vergleichen
    ElseIf .Item(1) Like sItem Or .Item(.Count) Like sItem Then
       Exit Function
    ElseIf .Item(.Count) < sItem Then
        .Add sItem, vKey: CollectionAddItem = .Count + 1     'an letzter Position einfügen
    Else
'durch binäre Suche die korrekte Position ermitteln
        nStart = 1: nEnd = .Count
        Do
          CollectionAddItem = (nStart + nEnd) \ 2
          If CollectionAddItem = nStart Then Exit Do
'Vergleich
          If .Item(CollectionAddItem) > sItem Then nEnd = CollectionAddItem
          If .Item(CollectionAddItem) < sItem Then nStart = CollectionAddItem
          If .Item(CollectionAddItem) = sItem Then Exit Function
        Loop
        On Error Resume Next
        .Add sItem, vKey, , CollectionAddItem
        CollectionAddItem = CollectionAddItem + 1
    End If
  End With
End Function

viele Grüße
Karl-Heinz

Anzeige
AW: Werte in Array aufsteigend sortieren
09.04.2020 05:15:14
Thorsten
Hallo Karl-Heinz,
Vielen Dank für den Vorschlag! Ich habe es mal ausgetestet und das Problem ist, dass zweistellige Zahlen unter die einstelligen einsortiert werden. In meinem Schnelltest sah die Sortierung dann so aus:
1
2
22
3
34
4
45
46
5
6
64
7
8
9
Ich muss ehrlich gestehen, dass ich deinen Code nicht gut genug verstehe, um das zu ändern.
Viele Grüße
Thorsten
Anzeige
AW: Werte in Array aufsteigend sortieren
09.04.2020 08:46:15
volti
Hallo Thorsten,
das vorliegende Makro sortiert nach Strings. Ich konnte aus Deinem Beitrag nicht erkennen, dass Du nur mit Zahlen arbeitest.
Hier noch mal eine Anpassung der Collection-Funktion, die jetzt nach Zahlen sortiert.
Auch Werte mit Kommastellen sind möglich...

Function CollectionAddItem(oCol As Collection, ByVal sItem As String, Optional iPos As Integer, Optional ByVal vKey As Variant) As Long
'Function fügt einen Eintrag sortiert in eine Collectionsammlung ein
  Dim nStart As Long, nEnd As Long, iItem As Double
  If Trim$(sItem) = "" Then Exit Function
  sItem = Replace(sItem, ",", ".")
  iItem = Val(sItem)
  With oCol
    If iPos <> 0 Then .Add sItem, vKey, 1: Exit Function
    If .Count < 1 Then .Add sItem, vKey:  Exit Function         'wenn Collection-Objekt noch leer ist
'Neuen Eintrag mit 1. Eintrag vergleichen
    If Val(.Item(1)) > iItem Then
       .Add sItem, vKey, 1                                      'an 1. Position einfügen
'jetzt mit letzten Eintrag vergleichen
    ElseIf Val(.Item(1)) = iItem Or .Item(.Count) = sItem Then
       Exit Function
    ElseIf Val(.Item(.Count)) < iItem Then
        .Add sItem, vKey: CollectionAddItem = .Count + 1     'an letzter Position einfügen
    Else
'durch binäre Suche die korrekte Position ermitteln
        nStart = 1: nEnd = .Count
        Do
          CollectionAddItem = (nStart + nEnd) \ 2
          If CollectionAddItem = nStart Then Exit Do
'Vergleich
          Select Case Val(.Item(CollectionAddItem))
          Case Is > iItem: nEnd = CollectionAddItem
          Case Is < iItem: nStart = CollectionAddItem
          Case Is = iItem: Exit Function
          End Select
        Loop
        On Error Resume Next
        .Add sItem, vKey, , CollectionAddItem
        CollectionAddItem = CollectionAddItem + 1
    End If
  End With
End Function
viele Grüße
Karl-Heinz

Anzeige
AW: Werte in Array aufsteigend sortieren
09.04.2020 15:09:56
Thorsten
Weltklasse! Vielen Dank!
Funktioniert erste Sahne! Genau so etwas hatte ich gesucht!
Jetzt muss ich nur noch den Code verstehen lernen, damit ich das selbst hinbekomme.
AW: Werte in Array aufsteigend sortieren
09.04.2020 16:16:42
volti
Vielen Dank für die Rückmeldung und viel Spaß und Erfolg beim Lernen
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Werte in Array aufsteigend sortieren in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Variablen deklarieren: Beginne mit der Deklaration der Variablen in deinem VBA-Modul. Du benötigst eine Collection, um die Werte zu speichern und zu sortieren.

    Dim oCol As New Collection
    Dim i As Long
  2. Werte einlesen: Lese die Werte aus dem gewünschten Bereich ein und füge sie in die Collection ein. Achte darauf, dass Duplikate ausgeschlossen werden.

    For i = 1 To UBound(vArr)
        CollectionAddItem oCol, vArr(i)
    Next i
  3. Sortieren: Verwende eine benutzerdefinierte Funktion, um die Collection aufsteigend zu sortieren. Siehe das Beispiel weiter unten für den spezifischen Code.

  4. Ausgabe: Übertrage die sortierten Werte in eine neue Spalte oder in eine Matrix, je nach Bedarf.


Häufige Fehler und Lösungen

  • Problem: Der Code sortiert Strings anstelle von Zahlen.

    • Lösung: Stelle sicher, dass die Funktion zur Hinzufügung von Elementen zur Collection die Werte als Zahlen behandelt. Hier ist eine angepasste Funktion:
    Function CollectionAddItem(oCol As Collection, ByVal sItem As String) As Long
        Dim iItem As Double
        iItem = Val(sItem)
        ' Rest der Funktion
    End Function
  • Problem: Zweistellige Zahlen werden nicht korrekt einsortiert.

    • Lösung: Achte darauf, dass die Sortierlogik die numerischen Werte korrekt vergleicht, nicht die String-Darstellung.

Alternative Methoden

  1. Excel-Funktion verwenden: Schreibe dein Array in ein Excel-Arbeitsblatt und nutze die eingebaute Sortierfunktion von Excel, um die Werte aufsteigend zu sortieren. Dies ist eine einfache Methode, wenn Du keine VBA-Lösung benötigst.

  2. Quicksort-Algorithmus: Du kannst auch einen Quicksort-Algorithmus in VBA implementieren. Es erfordert mehr Verständnis über die Programmierung, bietet jedoch eine schnelle und effiziente Sortierung.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um Werte in einem Array aufsteigend zu sortieren:

Sub TestArraySort()
    Dim vArr() As Variant
    Dim i As Long

    vArr = Array(5, 2, 8, 3, 1)

    ' Werte in Collection einfügen
    Dim oCol As New Collection
    For i = LBound(vArr) To UBound(vArr)
        CollectionAddItem oCol, vArr(i)
    Next i

    ' Werte aufsteigend sortieren und ausgeben
    For i = 1 To oCol.Count
        Debug.Print oCol.Item(i)
    Next i
End Sub

Tipps für Profis

  • Verwende die Option Explicit Direktive, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.
  • Achte darauf, dass Du die Werte korrekt in einer Collection hinzufügst, um eine effektive Sortierung durchzuführen.
  • Wenn Du mit großen Datenmengen arbeitest, kann es sinnvoll sein, die Sortierung in einem separaten Makro zu kapseln, um die Lesbarkeit und Wartbarkeit des Codes zu erhöhen.

FAQ: Häufige Fragen

1. Wie kann ich ein Array in VBA sortieren?
Du kannst ein Array in VBA sortieren, indem du eine Collection verwendest, um die Werte zu speichern und dann eine Sortierfunktion implementierst.

2. Welche Excel-Version benötige ich?
Die vorgestellten VBA-Techniken sind in Excel 2007 und späteren Versionen anwendbar.

3. Gibt es eine einfache Möglichkeit, Arrays zu sortieren?
Ja, die Verwendung der Collection ist eine einfache Methode, um Arrays in VBA aufsteigend zu sortieren, insbesondere wenn Duplikate entfernt werden müssen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige