Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1748to1752
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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
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
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

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige