ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA

Hola a todos:

Estos días he estado trabajando con matrices y con cadenas (Strings) de contenido numérico para realizar una ordenación de sus componentes.

Teniendo en cuenta que no se puede utilizar el método “Range.Sort”, básicamente porque no trabajamos con un rango, y que tampoco se posible crear un objeto arrayList para utilizar el método Sort, dado que la ordenación cuando trabajamos con números no se adecúa al estándar habitual, dado que ordena de la siguiente forma forma: 1, 10, 2, 3 …

Entonces el único método posible para realizar la ordenación de forma correcta y sin márgenes de error, es el que se explica con el Algoritmo de Ordenación de Burbuja. Os dejo en link a la Wikipedia para que lo podéis comprender mejor.

En teoría se trata de ir comparando el número (n) si es mayor al siguiente (n+1), en caso de serlo, se intercambia el lugar de ambos en la cadena, en caso de no serlo, se evalúa el siguiente y así hasta finalizar. He tomado el gif de la wikipedia para ilustrar gráficamente el comportamiento:

Ejemplo

Esta programación ya la he usado en varias ocasiones y me pareció interesante mostrar cómo se hace en VBA. Veamos un ejemplo:

ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA

Lo que queremos obtener es la ordenación de todos estos números y de paso, obtener el número menor y el mayor. Para realizar esto, vamos a utilizar la siguiente macro:

Sub Ordenar_String()
'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
'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)
'Una vez que tenemos el array ordenado,
'Extraemos el valor mínimo y el máximo
Valores = Split(Join(miArray, " "), " ")
For n = LBound(Valores) To UBound(Valores)
If n = LBound(Valores) Then Min = Valores(n)
If n = UBound(Valores) Then Max = Valores(n)
Next n
'Mostramos el máximo y el mínimo y mostramos todos los números ordenados.
Mensaje = MsgBox("El valor mínimo es: " & Min & " y el valor máximo es: " & Max, vbYesNo, "¿Quieres el detalle, pulsa en Si?")
If Mensaje = vbYes Then Listado = MsgBox(Join(miArray, " "), vbInformation, "LISTADO DE NÚMEROS")
End Sub

Si estudiáis bien el código, la parte fundamental, (el algoritmo), es este:

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)

Es aquí donde realizamos la tarea de comprar todos los números y ordenarlos de la forma que os describí anteriormente.

El resultado es el siguiente:

ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA_1

Y este es el resultado, he programado la macro para que muestre la cadena ordenada en un msgbox, pero con un sencillo loop lo podéis pasar a la hoja activa.

Y eso es todo, ahora ya sabéis cómo programar un algoritmo de ordenación, en este caso el de Burbuja. Y como siempre, os dejo el ejemplo.

Descarga el archivo de ejemplo pulsando en: ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA

¿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

Anuncios

¿Te ha gustado?, Realiza un comentario.

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.