Как отсортировать массив Excel на месте - PullRequest
1 голос
/ 25 мая 2020

Я заполняю массив Excel с помощью формулы массива и хочу, чтобы результаты были отсортированы. Если я пытаюсь выполнить сортировку (используя данные / сортировку), я получаю сообщение об ошибке «Вы не можете изменить часть массива». Единственный способ отсортировать его - это скопировать массив и вставить его как значения, а затем отсортировать эту копию. Есть ли способ лучше.

Шаги для репликации:

На пустом листе выберите диапазон A1: A10 и вставьте формулу массива, которая дает числовые c результаты, например = RAND () . Диапазон заполнен значениями. Попробуйте отсортировать диапазон с помощью Data / Sort, и вы получите указанную выше ошибку.

1 Ответ

1 голос
/ 25 мая 2020

«На месте»? Я сомневаюсь, что это возможно с функцией 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, указанной эта ссылка

enter image description here

...