«На месте»? Я сомневаюсь, что это возможно с функцией excel, поскольку это приведет к само / круговой ссылке.
Если вы выберете «A1: A10» и введете формулу массива (CSE) = Rand (), тогда ее можно будет отсортировать следующим образом Массив (CSE) формула в ячейке «D1» и скопирована. Это отсортирует массив в порядке возрастания. Чтобы отсортировать его в порядке убывания, замените «, 1)%» на «, 0)%»
=INDEX($A$1:$A$10,MATCH(SMALL(NPV(-RANK.EQ($A$1:$A$10,$A$1:$A$10,1)%,$A$1:$A$10)*100+ROW($A$1:$A$10),ROWS($A$1:A1)),NPV(-RANK.EQ($A$1:$A$10,$A$1:$A$10,1)%,$A$1:$A$10)*100+ROW($A$1:$A$10),0))
Ссылка на этот ответ из shrivallabha.redij
Для «На месте» функция массива см. UDF ниже. Выберите «H1: H10» и введите Массив (CSE) Формула =SortRandArr(H1:H10,1)
для сортировки по убыванию или =SortRandArr(H1:H10,0)
для сортировки по возрастанию.
Function SortRandArr(arrSizeRng As Range, Optional srtCriteria = 0)
'arrSizeRng is range of the same size of desired one dimensional array
'srtCriteria is criteria to sort; 0 or nothing for Ascending, Other digit for descending.
Application.Volatile
Dim Lb As Long, Ub As Long, i As Long, j As Long
Dim arr
ReDim arr(arrSizeRng.Cells.Count - 1)
For x = LBound(arr) To UBound(arr)
arr(x) = Round(Rnd(), 4)
Next
Lb = LBound(arr): Ub = UBound(arr)
If srtCriteria = 0 Then
For i = Lb To Ub - 1
For j = i + 1 To Ub
If Val(arr(i)) > Val(arr(j)) Then
strTemp = arr(i)
arr(i) = arr(j)
arr(j) = strTemp
End If
Next j
Next i
Else
For i = Lb To Ub - 1
For j = i + 1 To Ub
If Val(arr(i)) < Val(arr(j)) Then
strTemp = arr(i)
arr(i) = arr(j)
arr(j) = strTemp
End If
Next j
Next i
End If
SortRandArr = Application.Transpose(arr)
End Function
Для одномерной сортировки VBA, указанной эта ссылка