我使用数组公式填充Excel数组,并希望对结果进行排序。如果我尝试排序(使用数据/排序),就会得到“您不能更改数组的一部分”的错误。唯一能对其进行排序的方法是复制数组并将其粘贴为值,然后对该副本进行排序。有没有更好的方法。
复制步骤:
在空白工作表中,选择范围A1:A10,并插入给出数值结果的数组公式,例如=RAND()。范围内填充了值。尝试使用数据/排序对范围进行排序,您将得到上述错误。
发布于 2020-05-25 12:58:46
“就位”?我怀疑使用excel功能是否可行,因为它会导致自我/循环引用。
如果您选择"A1:A10“并输入一个数组(CSE)公式= Rand(),那么它可以按照单元格”“中的公式进行排序并复制下来。这将按升序对数组进行排序。若要按降序排序,请将",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))
从this answer引用shrivallabha.redij
对于“就位”数组函数,请参阅下面的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
对于引用到this link的一维VBA排序
https://stackoverflow.com/questions/62000203
复制相似问题