Чтобы сделать это в памяти, я сначала загрузил бы его в одномерный массив.
Затем я бы создал специальную функцию, которая выполняет пользовательскую сортировку массива.
После сортировки, а затем просто установите значение в этом диапазоне из отсортированного массива.
Sub Appel()
Dim TargetRange As Range
Set TargetRange = Range("D1", Range("D" & Rows.Count).End(xlUp))
'This returns as single dim array from a Range column
Dim ColumnData As Variant
ColumnData = Application.Transpose(TargetRange.Value)
Dim SortedData As Variant
SortedData = SortAbsoluteDecending(ColumnData)
'Set value of range equal to the new sorted array.
TargetRange.Value = Application.Transpose(SortedData)
End Sub
Public Function SortAbsoluteDecending(SourceArray As Variant) As Variant
Dim OuterIndex As Long
For OuterIndex = LBound(SourceArray) To UBound(SourceArray) - 1
Dim InnerIndex As Long
For InnerIndex = OuterIndex + 1 To UBound(SourceArray)
If Abs(SourceArray(OuterIndex)) < Abs(SourceArray(InnerIndex)) Then
Dim Temp As Variant
Temp = SourceArray(InnerIndex)
SourceArray(InnerIndex) = SourceArray(OuterIndex)
SourceArray(OuterIndex) = Temp
End If
Next InnerIndex
Next OuterIndex
SortAbsoluteDecending = SourceArray
End Function