definitivamente no tenés ganas de aprender...
acá va el código, está hecho con un procedimiento Sub
para hacerlo con Function hay que trabajar con matrices y funciones
matriciales, lo cual es un poco más complicado (para vos, no para mí)
no lo comenté, así que a estudiar...
Option Explicit
'//By JuanC - 24 de Junio de 2007
Sub OrdenaMatriz()
Dim mx() As Variant, v() As Variant
Dim P As Range, Matriz As Range
Dim i&, j&, ii&, jj&, m&, n&
Set Matriz = [B3:E7]
With Matriz
m = .Rows.Count
n = .Columns.Count
ReDim mx(m, n) As Variant
ReDim v(n) As Variant
Set P = Range(Split(.Address, ":")(0))
End With
For i = 0 To m - 1
For j = 0 To n - 1
mx(i, j) = P.Offset(i, j)
Next
Next
For i = 0 To m - 1
ii = 0
For j = 0 To n - 1
v(ii) = mx(i, j)
ii = ii + 1
Next
QuickSort v, 0, n - 1
ii = 0
For j = 0 To n - 1
mx(i, j) = v(ii)
ii = ii + 1
Next
Next
ii = 0
For i = 0 To m - 1
For j = 0 To n - 1
P.Offset(ii, jj) = mx(i, j)
jj = jj + 1
Next
ii = ii + 1
jj = 0
Next
Erase mx
Erase v
Set Matriz = Nothing
Set P = Nothing
End Sub
Private Sub QuickSort(vArray As Variant, L As Long, R As Long)
Dim i&, j&
Dim X As Variant, Y As Variant
i = L
j = R
X = vArray((L + R) / 2)
Do While (i <= j)
Do While (vArray(i) < X And i < R)
i = i + 1
Loop
Do While (X < vArray(j) And j > L)
j = j - 1
Loop
If (i <= j) Then
Y = vArray(i)
vArray(i) = vArray(j)
vArray(j) = Y
i = i + 1
j = j - 1
End If
Loop
If (L < j) Then QuickSort vArray, L, j
If (i < R) Then QuickSort vArray, i, R
End Sub
y asunto terminado...
Saludos desde Baires, JuanC
PD: para cambiar el sentido de la ordenación sólo basta cambiar algunos
signos en QuickSort