Subject: I wrote this for that purpose, however it was designed to take individual arrays
then sort then pull the sorted lists back out. It handles combinations of text and date/time or numbers.i.e.
Dim slist as new TSSortedLists()
Call slist.AddKeyArray(Array1, “+”)
Call slist.AddKeyArray(Array2, “-”)
Call slist.AddKeyArray(Array3, “+”)
Call slist.AddKeyArray(Array4, “+”)
Call slist.Sort()
SArray1 = slist.GetNthSortedArray(0)
SArray2 = slist.GetNthSortedArray(1)
SArray3 = slist.GetNthSortedArray(2)
SArray4 = slist.GetNthSortedArray(3)
Class TSSortedLists
Public KeyArray As Variant
Public AscDescFlags As Variant
Public Count As Integer
Public DType As Variant
Private nKeys As Integer
Sub New()
End Sub
Sub SwapKeys(p1, p2)
For k = 0 To Me.nKeys
t1 = Me.KeyArray(p1, k)
Me.KeyArray(p1, k) = Me.KeyArray(p2, k)
Me.KeyArray(p2, k) = t1
Next
End Sub
Function CompareKeys(d1, d2)
R1 = 0
For k = 0 To Me.nKeys
Select Case Me.DType(k)
Case "STRING"
tv1 = Me.KeyArray(d1, k)
tv2 = Me.KeyArray(d2, k)
Case "DATE"
tv1 = Cdat(Me.KeyArray(d1, k))
tv2 = Cdat(Me.KeyArray(d2, k))
Case Else
tv1 = Cdbl(Me.KeyArray(d1, k))
tv2 = Cdbl(Me.KeyArray(d2, k))
End Select
If AscDescFlags(k) = "-" Then
If tv1 < tv2 Then
R1 = 1
Exit For
Elseif tv1 > tv2 Then
R1 = -1
Exit For
End If
Elseif AscDescFlags(k) = "+" Then
If tv1 > tv2 Then
R1 = 1
Exit For
Elseif tv1 < tv2 Then
R1 = -1
Exit For
End If
End If
Next
CompareKeys = R1
End Function
Function CompareKeyToSaved(p1, SKA)
R1 = 0
For k = 0 To Me.nKeys
Select Case Me.DType(k)
Case "STRING"
tv1 = Me.KeyArray(p1, k)
tv2 = SKA(k)
Case "DATE"
tv1 = Cdat(Me.KeyArray(p1, k))
tv2 = Cdat(SKA(k))
Case Else
tv1 = Cdbl(Me.KeyArray(p1, k))
tv2 = Cdbl(SKA(k))
End Select
If AscDescFlags(k) = "-" Then
If tv1 < tv2 Then
R1 = 1
Exit For
Elseif tv1 > tv2 Then
R1 = -1
Exit For
End If
Elseif AscDescFlags(k) = "+" Then
If tv1 > tv2 Then
R1 = 1
Exit For
Elseif tv1 < tv2 Then
R1 = -1
Exit For
End If
End If
Next
CompareKeyToSaved = R1
End Function
Function SaveKey(p1)
Redim test1(Me.nKeys)
For k = 0 To Me.nKeys
test1(k) = Me.KeyArray(p1, k)
Next
SaveKey = test1
End Function
Sub RestoreKey(p1, SKA)
For k = 0 To Me.nKeys
Me.KeyArray(p1, k) = SKA(k)
Next
End Sub
Sub DoQS(bottom As Long, top As Long)
Dim length As Long
Dim i As Long
Dim j As Long
Dim Pivot As Long
Dim PivotValue As Variant
Dim t As Variant
Dim LastSmall As Long
length = top - bottom + 1
If length > 10 Then
Pivot = bottom + (length \ 2)
PivotValue = Me.SaveKey(Pivot)
Call Me.SwapKeys(Pivot, bottom)
LastSmall = bottom
For i = bottom + 1 To top
If CompareKeyToSaved(i, PivotValue) = -1 Then
LastSmall = LastSmall + 1
Call Me.SwapKeys(i, LastSmall)
End If
Next
Call Me.SwapKeys(LastSmall, bottom)
Pivot = LastSmall
Call Me.DoQS (bottom, Pivot - 1 )
Call Me.DoQS (Pivot + 1, top )
Else
For i = bottom+1 To top
x = i
test1 = Me.SaveKey(i)
Do While (Me.CompareKeyToSaved(x - 1, test1) > 0)
Call Me.SwapKeys(x, x - 1)
x = x - 1
If x = bottom Then
Exit Do
End If
Loop
Call Me.RestoreKey(x, test1)
Next
End If
End Sub
Sub AddKeyArray(Array1, AscDescFlag)
A1 = SetArray(Array1)
If Isempty(Me.KeyArray) Then
Me.nKeys = 0
Me.Count = Ubound(A1)
Redim Me.KeyArray(Me.Count, Me.nKeys)
Redim Me.AscDescFlags(Me.nKeys)
Redim Me.DType(Me.nKeys)
Else
Me.nKeys = Me.nKeys + 1
Redim Preserve Me.KeyArray(Me.Count, Me.nKeys)
Redim Preserve Me.AscDescFlags(Me.nKeys)
Redim Preserve Me.DType(Me.nKeys)
End If
Me.AscDescFlags(Me.nKeys) = AscDescFlag
Me.DType(nKeys) = Typename(A1(0))
For i = 0 To Me.Count
Me.KeyArray(i, nKeys) = Cstr(A1(i))
Next
End Sub
Function GetNthSortedArray(p1)
Redim r1(Me.Count)
Select Case Me.DType(p1)
Case "STRING"
For i = 0 To Me.Count
r1(i) = Me.KeyArray(i, p1)
Next
Case "DATE"
For i = 0 To Me.Count
r1(i) = Cdat(Me.KeyArray(i, p1))
Next
Case Else
r1(i) = Cdbl(Me.KeyArray(i, p1))
End Select
GetNthSortedArray = r1
End Function
Sub Sort()
Dim bottom As Long, top As Long
bottom = 0
top = Me.Count
Call Me.DoQS(bottom, top)
End Sub
End Class