MÉTODO SORT EN ARRAYLIST PARA ALFANUMÉRICOS Y ALGORITMO DE BURBUJA PARA NUMÉRICOS

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).

METODO SORT EN ARRAYLIST PARA ALFANUMÉRICOS Y AB PARA NUMERICOS

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):

METODO SORT EN ARRAYLIST PARA ALFANUMÉRICOS Y AB PARA NUMERICOS_1

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.

Donate Button with Credit Cards

¡¡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

ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST

Hola a todos!:

En esta web hay varios post dedicados a los listbox, tanto en formularios como objetos en la hoja. En el post de hoy me gustaría mostrar un código en el que vamos a ver un método para cargar los datos en nuestro listbox y también para ordenarlos.

Imaginad los siguientes datos:

ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST

Tenemos un listado de nombres y apellidos y nuestro objetivo es pasar al listbox los datos seleccionados y ordenarlos.

Veamos el código que os propongo:

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
'Formateamos el contenido de cada celda como texto
For Each Celda In Selection
If Not IsEmpty(Celda) Then MiMatriz.Add CStr((Celda))
Next Celda
'Ordenamos
MiMatriz.Sort
'Pasamos la información al listbox
For Each nItem In MiMatriz
.ListBox1.AddItem (nItem)
Next nItem
End With
End Sub

Sub BORRAR()
With Sheets("ORDENAR")
'Limpiamos combo y listbox
.ListBox1.Clear
End With
End Sub

Como podéis observar, vamos a trabajar con la selección como un rango de datos. Para ello tendremos que crear el objeto arraylist que nos permitirá ordenar la información de menor a mayor con el método .Sort.

Básicamente, con una instrucción For – Each vamos pasando cada elemento de la selección a nuestro arraylist (en este ejemplo no tendremos en cuenta las celdas vacías) y además damos formato texto a cada valor de las celdas seleccionadas (CStr) evitando así errores de tipos y también en el método Sort a la hora de comparar los datos para la ordenación. (Ojo con los números, que ordena de forma distinta al orden habitual).

Una vez pasados los datos, ordenamos. Si quisiéramos invertir el orden, simplemente tendríamos que incluir una nueva línea debajo del .Sort:

MiMatriz.Reverse

Una vez que lo tenemos, solo tenemos que pasar los datos al listbox mediante otro For-Each.

El resultado es para los nombres:

 

 

ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST_1

Espero que os haya resultado de interés!.

Descarga el archivo de ejemplo pulsando en: ORDENAR ELEMENTOS DE UN LISTBOX UTILIZANDO OBJETO ARRAYLIST

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡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