Довольно быстро (обычно) можно загнать в диапазон ячеек, отсортировать, забрать обратно.
Либо взять один из методов быстрой сортировки массива на Basic (VBA), который возвращает массив индексов элементов в порядке возрастания значений этих элементов и поменять в тексте этого метода пару строк.
Например, этот (ему лет 20):
' lang:en
' Sort a one-dimensional array.
' - arr array (one-dimensional) returns an array of integers (index from 1) containing the indices of the Arr elements,
' arranged in ascending order.
'
' The comparison is not case sensitive. If two elements have the same value, then the element with the lower index will follow first.
' If arr is not array, then returns False.
' lang:ru
' Сортировка одномерного массива.
' arr - массив (одномерный) возвращает массив целых чисел (индекс от 1), содержащий индексы элементов Arr,
' расположенных в возрастающем порядке.
' Сравнение производится без учета регистра. Если два элемента имеют одинаковое значение, то
' первым будет следовать элемент, имеющий меньший индекс.
' Если arr не является массивом, то возвращает False
Public Function QSort(ByVal arr As Variant) As Variant
Dim i1 As Long, i2 As Long ' границы Arr
Dim i As Long
Dim k1 As Long, k2 As Long
Dim w1, w2
Dim IndSort() As Long
Dim ind As Long
Dim i_m, i_1, i_2 As Long
If Not IsArray(arr) Then
QSort = False
Exit Function
End If
i1 = LBound(arr)
i2 = UBound(arr)
ind = i2 - i1 + 1
ReDim IndSort(1 To ind)
For i = 1 To ind
IndSort(i) = i1 + i - 1
Next i
i_m = Int(ind / 2)
While i_m > 0
i_1 = i_m + 1
While i_1 <= ind
i_2 = i_1 - i_m
Do While i_2 >= 1
k1 = IndSort(i_2)
k2 = IndSort(i_2 + i_m)
w1 = arr(k1)
w2 = arr(k2)
If VarType(w1) = vbString Then
w1 = UCase(w1)
End If
If VarType(w2) = vbString Then
w2 = UCase(w2)
End If
If w1 > w2 Or (w1 = w2 And k1 > k2) Then ' меняем местами индексы
IndSort(i_2) = k2
IndSort(i_2 + i_m) = k1
i_2 = i_2 - i_m
Else
Exit Do
End If
Loop
i_1 = i_1 + 1
Wend
i_m = Int(i_m / 2)
Wend
QSort = IndSort
End Function
Менять надо присвоения для w1, w2.