Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1916to1920
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

Mehrdim. Array nach Datum sortieren

Mehrdim. Array nach Datum sortieren
22.01.2023 15:43:09
Daniel
Hallo VBA Experten,
Ich versuche gerade, ein mehrdimensionales Array nach Spalte 2 zu sortieren, wenn in dieser Spalte ein gültiges Datum steht. Ich hoffe, Ihr könnt mir dabei helfen!
Die aus dem Netz kopierte Sortierfunktion sieht folgendermassen aus:
' vSort: 2-dimensionales Array
' index: Spalte, nach der sortiert werden soll (1, 2, 3, ...)
Public Sub QuickSortMultiDim(vSort As Variant, Optional ByVal index As Integer = 1, Optional ByVal lngStart As Variant, Optional ByVal lngEnd As Variant)
  ' Wird die Bereichsgrenze nicht angegeben,
  ' so wird das gesamte Array sortiert
  If IsMissing(lngStart) Then lngStart = LBound(vSort)
  If IsMissing(lngEnd) Then lngEnd = UBound(vSort)
  
  'Immer prüfen, in welcher Dimension nach dem Sortieren was steht
  
  Dim i As Long
  Dim j As Long
  Dim h As Variant
  Dim x As Variant
  Dim u As Long
  Dim lb_dim As Integer
  Dim ub_dim As Integer
  
  ' Anzahl Elemente pro Datenzeile
  lb_dim = LBound(vSort, 2)
  ub_dim = UBound(vSort, 2)
  
  i = lngStart: j = lngEnd
  x = vSort((lngStart + lngEnd) / 2, index - 1)
  
  ' Array aufteilen
  Do
    
    While (vSort(i, index - 1)  x): i = i + 1: Wend
    While (vSort(j, index - 1) > x): j = j - 1: Wend
    
    If (i = j) Then
      ' Wertepaare miteinander tauschen
      For u = lb_dim To ub_dim
        h = vSort(i, u)
        vSort(i, u) = vSort(j, u)
        vSort(j, u) = h
      Next u
      i = i + 1: j = j - 1
    End If
  Loop Until (i > j)
  
  ' Rekursion (Funktion ruft sich selbst auf)
  If (lngStart  j) Then QuickSortMultiDim vSort, index, lngStart, j
  If (i  lngEnd) Then QuickSortMultiDim vSort, index, i, lngEnd
End Sub
Vielen Dank!,
Daniel D.

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mehrdim. Array nach Datum sortieren
22.01.2023 17:18:20
Daniel
Hi
Da ich den Quicksort nicht verstehe, schreibe ich das Array in ein tabellenblatt, Sortieren dort mit der Sortierfunktion von Excel und lese dann die Daten wieder ins Array ein.
Gruß Daniel
Es ist nicht nur das
22.01.2023 17:23:50
lupo1
Der Quicksort in seiner reinen Form (wie vermutlich in der zitierten Prozedur) ist nicht nur schwierig zu verstehen, sondern es ist auch kein "stabiler Sort" (nachlesen!). Aber es ist der schnellste Sort.
Der Quicksort, der von Excel in der Tabelle genommen wird (siehe Daniels Hinweis), zieht daher die vorherige Position hinzu und berücksichtigt sie beim Sortierergebnis nachrangig.
AW: Es ist nicht nur das
22.01.2023 18:28:35
Daniel
Hi,
Vielen Dank für die Unterstützung. Den Vorschlag von Daniel werde ich so umsetzen. In meinem Kontext wäre das Sortieren des Arrays eleganter gewesen.
Daniel D.
Anzeige
AW: Es ist nicht nur das
22.01.2023 19:56:52
Daniel
Prio 1: es muss funktionieren
Prio 2: du musst verstehen, was du programmiert hast
Prio 999: es muss elegant sein
AW: Mehrdim. Array nach Datum sortieren
23.01.2023 12:46:07
snb
Vielleicht gefällt dieser besser:
Es wird ein 9* 9 Array sn erstellt.
'Spalte'/'Field' 5 enthält ein Datum.
Die Array wird am Sortierfunktion F_sort übergeben; und dazu der Nummer der Sortierspalte: 5
Nur für Kontrollzwecken wird das sortierte Array ins Arbeitsblatt geschrieben. Kann man auf verzichten und weiter arbeiten mit das sortierte Array sn.
Sub M_snb()
   ReDim sn(9, 9)
   
   For j = 0 To 9
      For jj = 0 To 9
        sn(j, jj) = IIf(jj = 5, Date - 365 * Rnd, Chr(66 + jj) & Int(100 * Rnd))
     Next
   Next
   
   sn = F_sort(sn, 5)
   Cells(30, 1).CurrentRegion.Resize(UBound(sn), UBound(sn, 2)) = sn
End Sub
Function F_sort(sn, y)
   With CreateObject("ADODB.recordset")
        For j = 0 To UBound(sn, 2)
            If j > y Then .Fields.Append "item" & j, 200, 30
            If j = y Then .Fields.Append "item" & j, 3
        Next
        .Open
        For j = 0 To UBound(sn)
            .AddNew
            For jj = 0 To UBound(sn, 2)
                .Fields("item" & jj) = sn(j, jj)
            Next
            .Update
        Next
        .Sort = "item" & y
        F_sort = Application.Transpose(.GetRows)
    End With
End Function

Anzeige
AW: Mehrdim. Array nach Datum sortieren
23.01.2023 18:05:20
Daniel
Hallo snb,
Vielen Dank für Deinen Code, ich werde gerne versuchen, diesen für mein Projekt zu verwenden.
Daniel D.

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige