Hola a todos:
Este post está centrado en la ordenación de arrays, no entraré en el método range.sort dado que no se trata de rangos sino de array (independientemente que para este ejemplo obtenga la información de un rango).
Cuando programamos rutinas largas o algoritmos complejos, es muy normal tener que ordenar información almacenada en matrices o «arreglos». No es jugar con un rango de la hoja, es trabajar con grandes cadenas de información.
Para realizar la ordenación, podemos usar algunas técnicas o métodos. Aunque ya están algunos de ellos publicado en esta web, conviene recordarlos y exponerlos con un ejemplo visual par comprender su funcionamiento.
Por ejemplo, para realizar ordenaciones con datos alfanuméricos, siempre recomiendo utilizar el método Sort y aplicarlos en ArrayList, dato que podemos convertir creando el objeto:
Set MiMatriz = CreateObject("System.Collections.ArrayList")
Cuando digo alfanumérico, me refiero a todo letras o letras y números. Nunca a únicamente números. Si tenemos que aplicar este método a números, funcionará siempre que apliquemos a números menores de 10, de otra forma produce ordenamientos no convencionales.
Con esta rutina podéis ver cómo seleccionado los datos de un rango de una hoja los pasamos a un ListBox (ordenados).
El código es este:
Sub ORDENAR_LIST()
'Definimos variables
Dim MiMatriz As Object, celda As Variant, nItem As Variant
'Vaciamos listbox
Call BORRAR
With Sheets("ORDENAR")
'Creamos objeto ArrayList
Set MiMatriz = CreateObject("System.Collections.ArrayList")
'Pasamos los datos seleccionados al ArrayList
'Si la celda está vacía, no la tenemos en cuenta
For Each celda In Selection
If Not IsEmpty(celda) And Not IsNumeric(celda) Then MiMatriz.Add CStr((celda))
Next celda
'Ordenamos
MiMatriz.Sort
MiMatriz.Reverse
'Pasamos la información al listbox
For Each nItem In MiMatriz
.ListBox1.AddItem (nItem)
Next nItem
End With
End Sub
Si queréis revertir el orden de ordenamiento solo tenéis que «descomentar» en el código 'MiMatriz.Reverse
Si lo que vamos a hacer es con números, entonces lo mejor es utilizar el algoritmo de ordenamientos de burbuja (o alguna de sus derivadas):
Y esta es la rutina:
Sub ORDENAR_STRING_NUMERO()
'Declaramos variables
Dim Rng As Range, fin As Long, celda As Variant
Dim Scadena As String, Valor As Variant, i, MiCadena As String
Dim miArray As Variant, Control As Boolean, BetaString As Double
Dim Valores As Variant, n, Max As String, Min As String
Dim Mensaje As Variant, Listado As Variant
Call BORRAR
'Seleccionamos rango con datos
Set Rng = Selection
'Componemos cadena si la celda tiene datos y es un número
For Each celda In Rng
If celda <> vbNullString And IsNumeric(celda) Then
MiCadena = MiCadena & " " & celda.Value
End If
Next celda
Scadena = Trim(MiCadena)
'Si la selección está vacía, salimos del procedimiento
If Scadena = vbNullString Then Exit Sub
'Pasamos la cadena a un array
Valor = Split(Scadena, " ")
ReDim miArray(0 To UBound(Valor))
For i = 0 To UBound(Valor)
miArray(i) = CDbl(Valor(i))
Next i
'Iniciamos loop y bucles para realizar
'algoritmo de burbuja
Do
Control = True
For i = 0 To UBound(miArray) - 1
If miArray(i) > miArray(i + 1) Then
Control = False
BetaString = miArray(i)
miArray(i) = miArray(i + 1)
miArray(i + 1) = BetaString
End If
Next i
Loop While Not (Control)
For Each nItem In miArray
Sheets("ORDENAR").ListBox1.AddItem (nItem)
Next nItem
End Sub
Si queréis revertir el orden de ordenamiento solo tenéis que cambiar el signo en esta línea del código: If miArray(i) > miArray(i + 1) Then
Y con estas dos técnicas podréis realizar ordenamientos seguros en vuestros arrays o matrices.
El uso del listbox en este post es anecdótico, lo utilizo exclusivamente para mostrar la ordenación de los datos.
Descarga el archivo de ejemplo pulsando en: MÉTODO SORT EN ARRAYLIST PARA ALFANUMÉRICOS Y ALGORITMO DE BURBUJA PARA NUMÉRICOS
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies