Página 1 de 1

macro para ordenar alfabéticamente en una matriz

NotaPublicado: Mié Nov 23, 2016 2:29 pm
por Inmaculada
¡Hola!, tengo un problema, estoy aprendiendo a realizar macros sencillas y me he encontrado con una dificultad. El caso es el siguiente: realizar una macro que pida 10 nombres y los almacene en una matriz, hasta ahí no hay ningún problema. Ahora lo que tengo que realizar es que se ordenen los nombres en orden alfabéticamente inverso.
Código: Seleccionar todo   Expandir vistaContraer vista
Option Explicit
Sub DiezNombres
   Dim M(10) As String
   Dim I As Integer
   Dim Mensaje As String
   Dim Nombre As String
   
'Los datos introducidos en la matriz son:   
   For I = 1 to 10   
      M(Nombre) = InputBox ("Introduce el" & " " & I & " " & "nombre en minúscula" & Nombre)   
         Mensaje = Mensaje & " el orden en la matriz es: " & I & " " & M(Nombre)   
         Mensaje = Mensaje & Chr(13)
   Next I   
      MsgBox Mensaje   
      
'Para ordenar de forma inversa alfabéticamente

End Sub

¿Cómo puedo realizar ese orden de forma inversa?

Un saludo

Re: macro para ordenar alfabéticamente en una matriz

NotaPublicado: Mié Nov 23, 2016 6:32 pm
por PepeOooSevilla
Hola.

Una forma (bajada de internet):
Código: Seleccionar todo   Expandir vistaContraer vista
REM  *****  BASIC  *****
Option Explicit
Option Base 1

Sub DiezNombres
    Dim M(10) As String
    Dim I As Integer
    Dim Mensaje As String
    Dim Nombre As String

    'Los datos introducidos en la matriz son:
    For I = 1 to 10
        M(I) = InputBox ("Introduce el" & " " & I & " " & "nombre en minúscula" & Nombre)
        Mensaje = Mensaje & " el orden en la matriz es: " & I & " " & M(I)
        Mensaje = Mensaje & Chr(13)
    Next I
    MsgBox Mensaje

    'Para ordenar de forma inversa alfabéticamente
    Call BubbleSortDescendingOrder(M())
    'Datos ordenados de forma descendente
    MsgBox Join(M(), Chr(13))

End Sub

Sub BubbleSortDescendingOrder(List() As Variant)
'Sorts the List array in descending order
    Dim First As Long, Last As Long
    Dim i As Long, j As Long
    Dim Temp As String

    First = LBound(List)
    Last = UBound(List)
    For i = First To Last - 1
        For j = i + 1 To Last
            If List(i) < List(j) Then
                Temp = List(i)
                List(i) = List(j)
                List(j) = Temp
            End If
        Next j
    Next i
End Sub

También, en el apartado "6.1.3 Moviendo hojas" del libro Aprendiendo OOo Basic nuestro compañero mauricio nos muestra una forma de personalizar esta ordenación. Este libro te resultará de mucha ayuda.

    ¡Atención! De manera predeterminada el índice inferior de las matrices es el 0. Si queremos comenzar en 1 entonces debemos escribir al principio del módulo "Option Base 1" (no es recomendable).
Saludos cordiales.