【问题标题】:How to sort an Excel array in place如何就地对 Excel 数组进行排序
【发布时间】:2020-09-11 23:04:03
【问题描述】:

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

复制步骤:

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

【问题讨论】:

  • 您需要更改数组公式以返回排序后的结果
  • 谢谢。您能否举例说明我需要如何更改现有的 {=RAND()} 公式才能做到这一点?
  • 如果你有Dynamic Array的新功能,试试=Sort(RandArray(10,1))

标签: excel sorting array-formulas


【解决方案1】:

“到位”?我怀疑 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

【讨论】:

  • 标记为早期版本的答案,但动态数组函数可能是最新版本的解决方案
  • 是的..我是办公室 16 :)
猜你喜欢
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2015-05-28
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多