Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何就地对Excel数组进行排序_Excel_Sorting_Array Formulas - Fatal编程技术网

如何就地对Excel数组进行排序

如何就地对Excel数组进行排序,excel,sorting,array-formulas,Excel,Sorting,Array Formulas,我正在使用数组公式填充Excel数组,并希望对结果进行排序。如果我尝试排序(使用数据/排序),我会得到错误“您不能更改数组的一部分”。唯一可以排序的方法是复制数组并将其粘贴为值,然后对副本进行排序。有更好的办法吗 复制的步骤: 在空白工作表中,选择范围A1:A10并插入一个给出数值结果的数组公式,例如=RAND()。该范围由值填充。尝试使用数据/排序对范围进行排序,您会得到上述错误。“就地”?我怀疑excel功能是否可行,因为它会导致自我/循环引用 如果选择“A1:A10”并输入数组(CSE)公

我正在使用数组公式填充Excel数组,并希望对结果进行排序。如果我尝试排序(使用数据/排序),我会得到错误“您不能更改数组的一部分”。唯一可以排序的方法是复制数组并将其粘贴为值,然后对副本进行排序。有更好的办法吗

复制的步骤:

在空白工作表中,选择范围A1:A10并插入一个给出数值结果的数组公式,例如=RAND()。该范围由值填充。尝试使用数据/排序对范围进行排序,您会得到上述错误。

“就地”?我怀疑excel功能是否可行,因为它会导致自我/循环引用

如果选择“A1:A10”并输入数组(CSE)公式=Rand(),则可以使用单元格“D1”中的以下数组(CSE)公式对其进行排序并向下复制。这将按升序对数组进行排序。若要按降序排序,请将“1)%”替换为“0)%”

来自Shrivalabha.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
函数SortRandArr(arrSizeRng作为范围,可选srtCriteria=0)
'arrSizeRng是与所需一维数组大小相同的范围
“SRT标准是分类的标准;0或零表示升序,其他数字表示降序。
应用程序。挥发性
暗淡的Lb长,Ub长,i长,j长
暗淡的边缘
ReDim arr(arrsizerg.Cells.Count-1)
对于x=LBound(arr)到UBound(arr)
arr(x)=四舍五入(Rnd(),4)
下一个
Lb=LBound(arr):Ub=UBound(arr)
如果srtCriteria=0,则
对于i=Lb至Ub-1
对于j=i+1至Ub
如果Val(arr(i))>Val(arr(j)),那么
strTemp=arr(i)
arr(i)=arr(j)
arr(j)=strTemp
如果结束
下一个j
接下来我
其他的
对于i=Lb至Ub-1
对于j=i+1至Ub
如果Val(arr(i))
对于一维VBA排序,请参考


您需要更改数组公式以返回其结果SortedHanks。你能举例说明我需要如何更改现有的{=RAND()}公式才能做到这一点吗?如果你有新功能,请尝试
=Sort(randary(10,1))
标记为早期版本的答案,但动态数组函数可能是最新版本的解决方案。。我的办公室是16:)
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