Saludos a todos 🙂
Espero que vaya muy bien. Hoy vamos a trabajar con matrices en VBA para realizar un ejercicio que suele ser bastante habitual: ordenar el contenido de una celda alfabéticamente. Y resulta útil cuando necesitamos ordenar listados de información, por ejemplo una serie de nombres, de frutas, etc.
Imaginad que tenéis en una serie de celdas la siguiente información:
Efectivamente son tres listados diferentes, con nombres de personas, de frutas y de árboles y sin ningún criterio de ordenación. La tarea es ordenar el contenido de cada celda alfabéticamente, y eso o bien lo hacemos a mano, con una combinación de fórmulas o con VBA. La mejor opción será VBA, ya que construiremos nuestra propia función para resolver este tipo de tareas.
Vamos a usar esta macro:
Function OrdenarAlfa(ByVal Micelda As String)
'Declaramos las variables
Dim Matriz As Object, Palabra As Variant
Dim alfaDato As Variant, iPalabra As String
'Creamos colección arraylist para ir agregando los elementos de la matriz
Set Matriz = CreateObject("System.Collections.ArrayList")
'Por cada objeto/palabra contenida en la celda seleccionada
For Each Palabra In Split(Micelda, " ")
'Añadimos cada palabra a la matriz con un bucle
Matriz.Add Palabra
Next Palabra
'Una vez la matriz creada la ordenamos
Matriz.Sort
'Pasamos los datos ya ordenados a una cadena de texto
For Each alfaDato In Matriz
iPalabra = iPalabra & " " & alfaDato
Next alfaDato
OrdenarAlfa = Trim(iPalabra)
'Limpiamos variable de objeto
Set Matriz = Nothing
End Function
Con esta función (OrdenarAlfa) seleccionamos la celda, pasamos todas las palabras a una matriz, la ordenamos alfabéticamente y luego pasamos los datos ordenados a una cadena (string) que pasamos a la función y por lo tanto a la celda que contiene la fórmula.
En este ejemplo estoy suponiendo que entre cada palabra hay un espacio en blanco, si la separación fuese una coma «,» (o cualquier otro símbolo), solo tenéis que cambiarlo en la macro en esta línea:
For Each Palabra In Split(Micelda, ",")
Y si queréis que las palabras resultantes de la fórmula también tengan una coma de separación, debéis cambiarlo en esta otra línea:
iPalabra = iPalabra & ", " & alfaDato
y modificar el dato que pasa a la función:
OrdenarAlfa = Trim(Mid(iPalabra, 2, Len(iPalabra)))
El resultado es el siguiente:
Ya tenemos todas las informaciones ordenadas alfabéticamente y con la ayuda de una nueva función. Obviamente, la podéis adaptar a un proceso automático o para mostrar los datos en un formulario, las posibilidades son muchas.
Y eso es todo, espero que os resulte de interés 🙂
Descarga el archivo de ejemplo pulsando en: ORDENAR LAS PALABRAS DE UNA CELDA ALFABETICAMENTE
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
hola muchas gracias por tu ayuda
me genero un problema a lo que descargo el archivo y le habilito macros sale el error de VALOR
Hola Fercho:
Acabo de probar la macro y funciona perfectamente. Está testada en excel 2010, 2013 y 2016. Verifica que estás introduciendo correctamente la función.
Saludos.
Hola me a generado error de valor me podeis ayudar
Hola Gerry tendría que ver los datos para poder responderte, saludos.
Buena tarde, tengo una duda en cuanto a tu codigo, en esta seccion «OrdenarAlfa = Trim(iPalabra)», ¿que es lo que realmente hace?
Hola Zuriell:
La función Trim en vba equivale a espacios en Excel. Es decir, con esa función elimino posibles espacios que puedas pasar a la cadena de texto.
Saludos.
Hola, algo similar pero con numeros separados por comas, gracias!!!
Hola Carlos:
Solo hay que hacer una sencilla modificación en el código, así:
Function OrdenarAlfa(ByVal Micelda As String)
'Declaramos las variables
Dim Matriz As Object, Palabra As Variant
Dim alfaDato As Variant, iPalabra As String
'Creamos colección arraylist para ir agregando los elementos de la matriz
Set Matriz = CreateObject("System.Collections.ArrayList")
'Por cada objeto/palabra contenida en la celda seleccionada
For Each Palabra In Split(Micelda, ",")
'Añadimos cada palabra a la matriz con un bucle
Matriz.Add Palabra
Next Palabra
'Una vez la matriz creada la ordenamos
Matriz.Sort
'Pasamos los datos ya ordenados a una cadena de texto
For Each alfaDato In Matriz
iPalabra = iPalabra & "," & alfaDato
Next alfaDato
OrdenarAlfa = Trim(Mid(iPalabra, 2, Len(iPalabra)))
'Limpiamos variable de objeto
Set Matriz = Nothing
End Function
Hola, muy bueno, gracias. Tuve que copiar/pegar mi info sobre el file excel descargable.
Cuando coloqué la codificación en el VBA de mi doc excel, no fue reconocida al momento de escribir la función =Orden…. Qué podría haber faltado?
Saludos
Renatto
Hola Renatto:
Lo has colocado en un módulo estándar??. No en el módulo de la hoja o en thisworkbook. Debes crear un módulo y pegar el código.
Saludos.