“到位”?我怀疑 excel 函数是否可行,因为它会导致自/循环引用。
如果您选择“A1:A10”并输入一个数组(CSE)公式 = Rand(),则可以在单元格“D1”中使用以下 数组(CSE) 公式对其进行排序并向下复制.这将按升序对数组进行排序。要按降序排序,请将 ",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 的对 this answer 的引用
“就地”数组函数参考下面的UDF。选择“H1:H10”并输入Array (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 排序参考this link