Der letzte Teil ...
Public Function HierarchicSort(ByRef Array_To_Sort As Variant, _
ByRef SortInfo() As tpSortInf) As String
'Hierarchisches Sortieren eines 2D-Array (1.Dim) nach
'ein- oder mehreren Spalten (= 2.Dimension)
'Bei einem Fehler ist der Rückgabestring nicht leer, sondern
'enthält die Fehlermeldung
If VarType(Array_To_Sort) < vbArray Then
HierarchicSort = "Kein Array als Parameter übergeben"
Exit Function
End If
'Grenzen des Array abfragen
Dim FirstCol As Integer: FirstCol = LBound(Array_To_Sort, 2)
Dim LastCol As Integer: LastCol = UBound(Array_To_Sort, 2)
Dim FirstRow As Integer: FirstRow = LBound(Array_To_Sort, 1)
Dim Lastrow As Integer: Lastrow = UBound(Array_To_Sort, 1)
'Grenzen der Sortierangaben abfragen
Dim FirstSortInfo As Integer: FirstSortInfo = LBound(SortInfo)
Dim LastSortInfo As Integer: LastSortInfo = UBound(SortInfo)
Dim ErrorMessage As String
Err.Clear
On Error GoTo errorexit
'Sortieranweisungen überprüfen
Dim sinf, sinf2, cind As Long
For sinf = FirstSortInfo To LastSortInfo
cind = SortInfo(sinf).ColumnIndex
If cind < FirstCol Or cind > LastCol Then
HierarchicSort = "Sortierspalte: ungültiger Index"
Exit Function
End If
For sinf2 = sinf + 1 To LastSortInfo
If cind = SortInfo(sinf2).ColumnIndex Then
HierarchicSort = "Sortierspalte wird doppelt" & _
"verwendet"
Exit Function
End If
Next sinf2
Next sinf
'zunächst Sortieren des Array nach der hierarchisch höchsten Spalte
If Not QuickSort_ArrayColumn(Array_To_Sort, SortInfo( _
FirstSortInfo).ColumnIndex, _
FirstRow, Lastrow, SortInfo(FirstSortInfo).SortAscending, _
ErrorMessage) Then
HierarchicSort = ErrorMessage: Exit Function
End If
Dim row, irow As Integer, abb, iabb As Boolean
Dim i, k As Integer
'Schleife über die nachgeordneten Sortier-Anweisungen
For sinf = FirstSortInfo + 1 To LastSortInfo
row = FirstRow - 1: abb = False
'Arrayzeilen durchlaufen
While row < Lastrow And Not abb
'Suche nach einem Abschnitt identischer Werte in den
' hierarchisch
'übergeordneten Spalten
row = row + 1: irow = row: iabb = False
While irow < Lastrow And Not iabb
irow = irow + 1
'wechselt der Wert in einer übergeordneten Spalte?
' --> Bereich endet
For i = FirstSortInfo To sinf - 1
If (Array_To_Sort(irow, SortInfo(i).ColumnIndex) <> _
Array_To_Sort(row, SortInfo(i).ColumnIndex)) Then _
iabb = True
Next i
Wend
If Not iabb Then irow = irow + 1 'Letzte Zeile einbeziehen
If irow > row + 1 Then
'Abschnitt gefunden: nach aktueller Sortierspalte
' sortieren
If Not QuickSort_ArrayColumn(Array_To_Sort, SortInfo( _
sinf).ColumnIndex, _
row, irow - 1, SortInfo(sinf).SortAscending, _
ErrorMessage) Then
HierarchicSort = ErrorMessage: Exit Function
End If
End If
'Nächsten Abschnitt ermitteln (oder beenden)
row = irow - 1: abb = irow >= Lastrow
Wend
Next sinf
'Routine korrekt beendet: Leerstring zurückgeben
HierarchicSort = "": Exit Function
errorexit:
HierarchicSort = Err.Description
End Function
Beitrag wurde zuletzt am 25.12.09 um 17:59:49 editiert. |