Uno de los primeros post que publiqué en este blog fue una sencilla macro para ordenar columnas con autofiltro, este es el enlace: MACRO PARA ORDENAR ALFABÉTICAMENTE. En ese ejercicio la macro ordenaba un rango de columnas siguiendo unos criterios determinados, es decir, daba por supuesto que la información de las columnas que vas a ordenar con el autofiltro está relacionada entre si.
Cuando ordenas de forma ascendente los datos de una columna, al estar el autofiltro seleccionado el rango de varias columnas se modifica el orden en el resto. Normalmente es así como procedemos cuando trabajamos, pero recientemente he recibido varias consultas preguntando si es posible crear un proceso que ordene cada una de las columnas de forma independiente, de manera que podamos, por ejemplo, ordenar todos los datos de cada columna en orden ascendente o descendente, según nuestras necesidades.
Los lectores Caleb y Palma indicaban así sus preguntas:
Caleb: «…quisiera consultarle si se puede realizar este procedimiento en diferentes filas, pues mis datos se clasifican en varias Filas»
Palma: ...»Segu, disculpa pero por ejemplo yo tengo una hoja que llega hasta la celda (“YU”) creo que copiar y pegar hasta llegar esta celda es una lata…No habrá una forma de poner el rango desde A hasta YU sin copiar y pegar toda la vida?»
En su momento, les indiqué varias alternativas que finalmente no me acabaron de convencer, tanto la solución que indicaba microsoft, como la otra que había confeccionado yo mismo requerían un exceso de trabajo manual haciendo del proceso algo engorroso y complicado y que no se ajustaba a los requerimientos solicitados.
El post de hoy dará una solución definitiva a este asunto con una macro mucho más depurada y potente. Para comenzar y siguiendo el ejercicio de siempre, voy a poner un ejemplo práctico.
Imaginad que trabajamos en una empresa como técnicos de información y cada cierto tiempo nos van entregando los datos de facturación para que los vayamos acumulando en columnas y clasificando por mes. No nos interesa conocer el detalle de vendedores ni otro tipo de información que no sea los datos puros ordenados de forma descendente, dado que nuestro jefe nos ha pedido un listado ordenado donde pueda ver las ocho primeras cantidades más altas de la facturación de cada mes.
Como los datos pocas veces vienen como los necesitamos, resulta que están desordenados, así:
Nuestra labor será la de ordenar cada una de las columnas en orden descendente de forma que los valores más altos estén al principio y los más bajos al final. Como no tenemos tiempo para ir filtrando de forma manual columna por columna usaremos esta macro que he preparado específicamente para este ejercicio:
Sub OrdenarColumnasIndep()
Dim i As Double
'Definimos cuantas columnas debemos ordenar contando las que tienen contenido
fin = Application.CountA(Worksheets("Hoja1").Range("1:1"))
For i = 1 To fin
'Definimos el rango de cada columnas, desde la celda 1 hasta el final con datos
Range(Cells(1, i), Cells(1, i).End(xlDown)).Select
'Indicamos para cada columna y rango seleccionado el mismo proceso mediante un bucle
'donde debe filtrar y ordenar los datos de forma descendente
Selection.AutoFilter
Range(Cells(1, i), Cells(1, i).End(xlDown)).Sort Key1:=Cells(1, i), Order1:=xlDescending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Next
End Sub
Gracias a esta macro podremos automatizar el proceso de forma sencilla, además el código está preparado para detectar el rango de cada columna, aunque algunas sean más largas que otras y también para establecer el número de columnas que debemos filtrar. Una vez que ejecutemos este código tendremos el siguiente resultado:
Como podéis observar, todas las columnas se han ordenado automáticamente según nuestro criterio, independientemente de su número y rango de longitud.
Personalmente creo que ha quedado bastante bien, el código realiza la tarea de forma eficiente y rápida, no he querido eliminar la actualización de pantalla para que veáis el proceso cuando ejecutéis la macro.
Casi se me olvidaba, en este ejemplo estoy trabajando con datos contiguos, es decir, dando por supuesto que no tenemos celdas en blanco o vacías en el rango a seleccionar y que todas las celdas hasta la última contienen datos. En caso de que no fuese así y tuviésemos celdas en blanco, tendríamos que modificar nuestra macro, dado que la sentencia .End(xlDown) hace referenca a la última celda con datos. La solución es muy sencilla, solo tendréis que modificar lo que indico en rojo en el código:
Sub OrdenarColumnasIndep()
Dim i As Double
'Definimos cuantas columnas debemos ordenar contando las que tienen contenido
fin = Application.CountA(Worksheets("Hoja1").Range("1:1"))
For i = 1 To fin
'Definimos el rango de cada columnas, desde la celda 1 hasta el final con datos
Range(Cells(1, i), Cells("65536", i)).Select
'Indicamos para cada columna y rango seleccionado el mismo proceso mediante un bucle
'donde debe filtrar y ordenar los datos de forma descendente
Selection.AutoFilter
Range(Cells(1, i), Cells("65536", i)).Sort Key1:=Cells(1, i), Order1:=xlDescending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Next
End Sub
Importante: En el ejemplo os dejo dos botones, en el primero se ejecuta la macro ordenar con datos contiguos y el segundo ordena los datos cuando no son contiguos (existen celdas en blanco entre los rangos). Para probar esta última modalidad solo tenéis que borrar algunas celdas y luego ordenar, así veréis la diferencia entre ambos códigos. Obviamente la segunda macro es un poco más lenta porque selecciona hasta la última celda de la hoja, mientras que la primera solo hasta la última fila con datos.
Os dejo el archivo de descarga para que podáis examinar y probar la macro, espero que os sirva y la podáis incorporar a vuestras tareas. 🙂
Descarga el archivo de ejemplo pulsando en: ORDENAR EN COLUMNAS INDEPENDIENTES
Excelente aporte, lo he usado varias veces en mis hojas de excel, pero tengo una duda, lo que pasa es que si inserto una columna en blanco cuando ejecuto la macro, la ultima columna con datos no la ordena, si inserto dos columnas las ultimas columnas no las ordena, y así sucesivamente, ¿Existe la manera que la macro que formulaste pueda ordenar todos los datos, a pesar que existan columnas en blanco?, te lo agradecería.
Para resumir, supongamos que en la imagen que colgaste en este Post, entre Febrero y Marzo inserto una columna en blanco, si ejecutas la macro, solo va a ordenar hasta noviembre, si inserto otra columna entre febrero y marzo, al ejecutar la macro solo va a ordenar hasta octubre, ¿Existe la forma de modificar la macro que formulaste para que ordene a pesar de tener columnas en blanco entre la base de datos?, gracias de antemano.
Hola Diego,
Tal y como te contesté por correo, para ordenar las columnas incluso cuando insertas una columna sin datos, es necesario modificar la macro, en concreto en esta línea:
fin = Application.CountA(Worksheets("Hoja1").Range("1:1"))
For i = 1 To fin
Donde la variable fin ya no tiene sentido su uso ya que no puede hacer referencia a columnas en blanco. Elimina la línea o coméntala.
Donde tienes que realizar el cambio es en el For, sustituyendo «fin» por el número total de columnas incluidas las que no tienen datos, según tu ejemplo, sería:
For i = 1 To 13
Saludos.
Muchas gracias compañero, me sacaste de una duda que tuve con la macro que diseñaste, mil gracias !!!
Fenomenal, simple, rapido sencillo…
En mi caso eran 155 columnas, asi que muchas gracias
Gracias FGD, me alegro te haya resultado de utilidad.
Saludos.
Hola, buenas tardes.
Es posible ordenar datos de texto que se encuentran en la misma celda (habiendo presionado Alt+Enter)?
Gracias.
Hola Maggie:
Es posible siempre que se esas teclas (Alt + Enter) estén vinculadas a una macro y en dicho código se determine que orden se quiere que tengan dichos datos. Por cierto, no sería una macro sencilla.
Saludos.
Gracias por responderme tan rápido y por tu amabilidad.
Muchísimas gracias ! Ha funcionado a la perfección ! Eran 493 columnas que no sabía como ordenar en forma descendente !
Gracias a ti Natalia. Me alegro que te haya sido de utilidad. Saludos
Muy Agradecido con tu Valioso e Importante aporte. En serio, me sigo sonriendo solo. Fue justo lo que buscaba. Estamos habalndo de casi 1200 Datos, que debía organizar para formar una lista. Gracias
Hola Rufyador:
Me alegra que te haya servido!!! Saludos
Muchas gracias, esta macro y que explicaras como editarla me ha ahorrado semanas de trabajo de ordenar manualmente columnas de cientos de documentos de excel.
Muchas gracias Sayui, me alegra que hayas podido ahorrar tiempo en tu trabajo y te haya sido de utilidad. Un saludo!!
Hola buenas tardes esta macro se puede adaptar utilizando sobre celdas seleccionadas, por ejemplo mi base de dato es de la a2:g50 y nada mas quiero que se ordenen de la fila 10 a la 35 y que se ordenen 2 columnas la f ascendente y la a descendente
Así:
Sub OrdenarColumnasIndep()
Dim i As Double
With Selection
Selection.AutoFilter
Range(Cells(1, 1), Cells(1, 1).End(xlDown)).Sort Key1:=Cells(1, 1), Order1:=xlDescending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range(Cells(1, 7), Cells(1, 7).End(xlDown)).Sort Key1:=Cells(1, 7), Order1:=xlAscending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With
End Sub