30 noviembre, 2023

ORDENAR COLUMNAS DE FORMA INDEPENDIENTE

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

ORDENAR EN COLUMNAS INDEPENDIENTES

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:

ORDENAR EN COLUMNAS INDEPENDIENTES_1

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

Comparte este post

18 comentarios en «ORDENAR COLUMNAS DE FORMA INDEPENDIENTE»

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

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

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

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

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

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

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

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

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies