Sé que el OP especificado no utilizar hojas de trabajo, pero su pena señalar que la creación de una nueva hoja de cálculo, usándolo como un bloc de notas para hacer la clase con funciones de hoja, entonces la limpieza después es más largo por menos de un factor de 2. Pero también tiene toda la flexibilidad entregada por los parámetros de la función Sort WorkSheet.
En mi sistema, la diferencia fue de 55 ms para el muy agradable rutina recursiva por @ tannman357 y 96 ms para el método siguiente. Esos son tiempos promedio en varias carreras.
Sub rangeSort(ByRef a As Variant)
Const myName As String = "Module1.rangeSort"
Dim db As New cDebugReporter
db.Report caller:=myName
Dim r As Range, va As Variant, ws As Worksheet
quietMode qmON
Set ws = ActiveWorkbook.Sheets.Add
Set r = ws.Cells(1, 1).Resize(UBound(a), 1)
r.Value2 = rangeVariant(a)
r.Sort Key1:=r.Cells(1), Order1:=xlDescending
va = r.Value2
GetColumn va, a, 1
ws.Delete
quietMode qmOFF
End Sub
Function rangeVariant(a As Variant) As Variant
Dim va As Variant, i As Long
ReDim va(LBound(a) To UBound(a), 0)
For i = LBound(a) To UBound(a)
va(i, 0) = a(i)
Next i
rangeVariant = va
End Function
Sub quietMode(state As qmState)
Static currentState As Boolean
With Application
Select Case state
Case qmON
currentState = .ScreenUpdating
If currentState Then .ScreenUpdating = False
.Calculation = xlCalculationManual
.DisplayAlerts = False
Case qmOFF
If currentState Then .ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.DisplayAlerts = True
Case Else
End Select
End With
End Sub
Todo el tutorial sobre cómo ordenar una matriz. Ellis te ha dado muchas opciones para ordenar una matriz :) Haz tu elección. http://www.vbforums.com/showthread.php?t=473677 –
Ver la publicación http://stackoverflow.com/a/11012529/797393. – Cylian