AW: Vokabeln spaltenübergreifend sortieren
24.04.2008 09:17:00
Erich
Hi Renée und Werner,
die Routine sortiert Kleinbuchstaben hinter Großbuchstaben, "a" kommt nach "Z".
Das stört hier vermutlich. (Werner hat allerdings nicht angegeben, wie sortiert werden soll.)
Hier eine Alternative, die Klein- wie Großbuchstaben sortiert:
Option Explicit
Sub SortU_50_10()
Dim varA, varB(1 To 500, 1 To 2), ss As Long, zz As Long
varA = Range(Cells(2, 1), Cells(51, 10)).Value
For ss = 1 To 10
For zz = 1 To 50
varB(zz + 50 * (ss - 1), 1) = varA(zz, ss)
varB(zz + 50 * (ss - 1), 2) = UCase(varA(zz, ss))
Next zz
Next ss
prcSort Array(2), varB()
For ss = 1 To 10
For zz = 1 To 50
varA(zz, ss) = varB(zz + 50 * (ss - 1), 1)
Next zz
Next ss
Range(Cells(2, 1), Cells(51, 10)) = varA
End Sub
' www.online-excel.de/excel/singsel_vba.php?f=97
' Code Max Kaffl (Nepumuk) 2005
'Quicksort mit mehreren Sortierkriterien
' Parameter: arrK = Sortkeys (Spaltennummern)
' arrD = zu sortierendes Array
'Der Sortierschlüssel ist ein Array mit minimal einem Eintrag,
' Der erste Eintrag gibt die Spalte mit dem obersten Sortierkriterium an.
' Ist die Zahl positiv, wird aufsteigend, sonst absteigend sortiert.
Private Sub prcSort(arrK As Variant, arrD() As Variant)
Dim iiK As Integer, nnB As Long, nnC As Long, nArrZ() As Long
Dim nnZ As Long, nnA As Long, vntTemp As Variant
ReDim nArrZ(0 To 1, 0 To UBound(arrD) * 2)
nArrZ(0, 0) = LBound(arrD) ' Array für den 1. Sortierlauf
nArrZ(0, 1) = UBound(arrD)
nnZ = 1
For iiK = LBound(arrK) To UBound(arrK)
If arrK(iiK) 0 Then ' Wenn eine Spalte angegeben
nnA = -1
For nnB = 0 To nnZ Step 2 ' Schleife zum sortieren der Bereiche
If nArrZ(0, nnB) nArrZ(0, nnB + 1) Then ' Sortieren, wenn Zeilenzahl größer 1
Call prcQSort(CLng(nArrZ(0, nnB)), _
CLng(nArrZ(0, nnB + 1)), CInt(Abs(arrK(iiK))), _
CBool(arrK(iiK) > 0), arrD())
nnA = nnA + 2 ' sortierten Bereich merken
nArrZ(1, nnA - 1) = nArrZ(0, nnB)
nArrZ(1, nnA) = nArrZ(0, nnB + 1)
End If
Next
nnZ = -1
For nnB = 0 To nnA Step 2 'Durchsuchen der eben sortierten Spalte nach Wertewechsel
vntTemp = arrD(nArrZ(1, nnB), Abs(arrK(iiK))) '1. Zeile des zu sort. Bereichs
nnZ = nnZ + 1
nArrZ(0, nnZ) = nArrZ(1, nnB)
For nnC = nArrZ(1, nnB) To nArrZ(1, nnB + 1) ' Suche nach Wechsel im Bereich
If vntTemp arrD(nnC, Abs(arrK(iiK))) Then
nnZ = nnZ + 2
nArrZ(0, nnZ - 1) = nnC - 1
nArrZ(0, nnZ) = nnC
vntTemp = arrD(nnC, Abs(arrK(iiK)))
End If
Next
nnZ = nnZ + 1 ' letzte Zeile im Bereich
nArrZ(0, nnZ) = nArrZ(1, nnB + 1)
Next nnB
End If
Next iiK
End Sub
Private Sub prcQSort(lngLB As Long, lngUB As Long, iiZ As Integer, bAufAb As Boolean, arrD())
Dim iiK As Integer, nnB As Long, nnC As Long, vntTemp As Variant, vntBuffer As Variant
nnB = lngLB
nnC = lngUB
vntBuffer = arrD((lngLB + lngUB) \ 2, iiZ)
Do
If bAufAb Then
Do While arrD(nnB, iiZ) vntBuffer: nnB = nnB + 1: Loop
Do While vntBuffer > arrD(nnC, iiZ): nnC = nnC - 1: Loop
End If
If nnB arrD(nnC, iiZ) Then
For iiK = LBound(arrD, 2) To UBound(arrD, 2)
vntTemp = arrD(nnB, iiK)
arrD(nnB, iiK) = arrD(nnC, iiK)
arrD(nnC, iiK) = vntTemp
Next
End If
nnB = nnB + 1
nnC = nnC - 1
ElseIf nnB = nnC Then
nnB = nnB + 1
nnC = nnC - 1
End If
Loop Until nnB > nnC
If lngLB
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort