Actually chunking the sorting speeds things up even more. Sure the code is pretty ugly, but 16 seconds down to 6 is 2.6x faster:
Var Col As Integer
Var SortCache() As String, SortData() As String
SortData.ResizeTo ColDefs( 0 ).Data.LastIndex
SortCache.ResizeTo ColDefs( 0 ).Data.LastIndex
SortArrayBuild ColKey1, Assending1, ColKey2, Assending2, SortCache
For Col = Col1 To Col2 Step 10
SortArrayCopy SortCache, SortData
If Col + 10 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data, _
ColDefs( Col + 3 ).Data, _
ColDefs( Col + 4 ).Data, _
ColDefs( Col + 5 ).Data, _
ColDefs( Col + 6 ).Data, _
ColDefs( Col + 7 ).Data, _
ColDefs( Col + 8 ).Data, _
ColDefs( Col + 9 ).Data )
SGP.RunsCurrent = SGP.RunsCurrent + 10
ElseIf Col + 9 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data, _
ColDefs( Col + 3 ).Data, _
ColDefs( Col + 4 ).Data, _
ColDefs( Col + 5 ).Data, _
ColDefs( Col + 6 ).Data, _
ColDefs( Col + 7 ).Data, _
ColDefs( Col + 8 ).Data )
SGP.RunsCurrent = SGP.RunsCurrent + 9
ElseIf Col + 8 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data, _
ColDefs( Col + 3 ).Data, _
ColDefs( Col + 4 ).Data, _
ColDefs( Col + 5 ).Data, _
ColDefs( Col + 6 ).Data, _
ColDefs( Col + 7 ).Data)
SGP.RunsCurrent = SGP.RunsCurrent + 8
ElseIf Col + 7 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data, _
ColDefs( Col + 3 ).Data, _
ColDefs( Col + 4 ).Data, _
ColDefs( Col + 5 ).Data, _
ColDefs( Col + 6 ).Data)
SGP.RunsCurrent = SGP.RunsCurrent + 7
ElseIf Col + 5 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data, _
ColDefs( Col + 3 ).Data, _
ColDefs( Col + 4 ).Data, _
ColDefs( Col + 5 ).Data)
SGP.RunsCurrent = SGP.RunsCurrent + 6
ElseIf Col + 4 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data, _
ColDefs( Col + 3 ).Data, _
ColDefs( Col + 4 ).Data)
SGP.RunsCurrent = SGP.RunsCurrent + 5
ElseIf Col + 3 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data, _
ColDefs( Col + 3 ).Data)
SGP.RunsCurrent = SGP.RunsCurrent + 4
ElseIf Col + 2 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data, _
ColDefs( Col + 2 ).Data)
SGP.RunsCurrent = SGP.RunsCurrent + 3
ElseIf Col + 1 <= Col2 Then
SortData.SortWith( _
ColDefs( Col ).Data, _
ColDefs( Col + 1 ).Data)
SGP.RunsCurrent = SGP.RunsCurrent + 2
Else
SortData.SortWith( ColDefs( Col ).Data )
SGP.RunsCurrent = SGP.RunsCurrent + 1
End If
Next