29 mayo, 2023

ORDENAR UN RANGO MEDIANTE SELECCIÓN

Llevo unas semanas liado con varios asuntos que no me han permitido agregar contenido nuevo a la web. Y es complicado, porque entre la gripe y compromisos varios, ciertamente han sido unos días bastante duros.

Pero bueno, hoy tengo un poco de tiempo y lo voy a aprovechar para escribir un post sobre la posibilidad de ordenar el contenido de un rango que previamente hemos seleccionado. Esta consulta me la planteó un lector que necesitaba ordenar diferentes rangos de datos en una hoja de forma periódica, evitando así tener que aplicar un filtro de datos cada vez que quería ordenar.

Vamos a poner un ejemplo y utilizaremos la base de datos habitual de unos grandes almacenes, pero modificando su distribución y distinguiendo entre las diferentes áreas (un rango para cada una de ellas) y separando cada tramo con una fila en blanco. Vamos a conservar los encabezados de cada columna, el ejemplo es este:

ORDENAR UN RANGO MEDIANTE SELECCION

Pues bien, si queremos ordenar cada uno de estos departamentos de forma separada, por ejemplo: ALIMENTACIÓN, ordenada alfabéticamente por nombre y BEBÉS Y CARROCERÍA por fecha de nacimiento, tenemos que acudir a VBA.

Vamos a ver la macro que utilizaremos:

Sub ORDENAR()
'Declaramos las variables
Dim rRango As Range
Dim cCell As Range
'rRango será la selección de las líneas completas del rango
Set rRango = Selection.EntireRow
'cCell será la celda activa
Set cCell = ActiveCell
'En caso de que hayamos seleccionando celdas en blanco, la macro no se ejecutará
'En caso contrario ordenaremos el rango seleccionado
If cCell <> Empty Then
rRango.Sort Key1:=cCell, Order1:=xlAscending, Header:=xlYes
End If
End Sub

Y este es el proceso mediante el cual podemos realizar nuestra ordenación automática. Pero surge un problema, ¿Cómo lo ejecutamos?, si lo hacemos vinculando la macro a un botón, sería muy engorroso tener que desplazarnos continuamente para pulsarlo y utilizando eventos como click con botón derecho del ratón o con cada cambio de selección no me parecen funcionales.

Por ello, lo más indicado sería utilizar un evento asociado a una tecla, es decir que cuando seleccionemos el área a ordenar solo tengamos que pulsar una tecla para activar y ejecutar la macro. Esto es muy más funcional, y en este caso la tecla que he elegido es Escape (ESC), dado que está en la esquina del teclado y resulta muy cómodo pulsarla.

Podéis consultar el nombre de otras teclas por si escape no os gusta en este link: https://msdn.microsoft.com/es-es/library/office/ff197461.aspx

Para ello debemos incluir esta línea en el módulo de la página donde tenemos que ordenar los datos:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.OnKey "{ESCAPE}", "ORDENAR"
End Sub

Con esta macro lo que hacemos es que cuando tenemos la selección realizada, en el momento de pulsar la tecla ESCAPE o ESC el evento llamará a la macro anterior que hemos denominado “ORDENAR”.

Si os fijáis en el código de la macro, especificamos que el rango que vamos a seleccionar tiene encabezados (Header:=xlYes) por ello, debemos seleccionarlos, en caso de no hacerlo, la primera fila a ordenar será considerada encabezado y la macro no la ordenará.

Veamos la ordenación del departamento de ALIMENTACIÓN:

ORDENAR UN RANGO MEDIANTE SELECCION1

Como podéis ver solo selecciono la columna «B» (NOMBRE COMPLETO) desde el encabezado hasta la última línea de datos (A1:A:11), luego pulso escape y queda ordenado alfabéticamente (y ascendente) por nombre. Lo mismo haremos con BEBÉS Y CARROCERÍA pero con la columna de «D» (NACIMIENTO).

Así quedaría el resultado:

ORDENAR UN RANGO MEDIANTE SELECCION2

Como podéis ver, ahora ya tenemos los datos ordenamos en función de la columna que hemos elegido: ALIMENTACIÓN por el nombre y BEBÉS Y CARROCERÍA por la fecha.

En caso de que seleccionéis un rango más grande, por ejemplo dos o tres columnas, siempre ordenará en función de la celda activa de la primera columna que habéis seleccionado, pero esto no es necesario dado que ordena todo el rango de filas con solo seleccionar la columna.

Y este ha sido el ejemplo de hoy, creo que es un procedimiento muy interesante y útil, sobre todo para realizar tareas muy repetitivas y extensas.

Como siempre os dejo el archivo de prueba, espero que os sea de utilidad.

Descarga el archivo de ejemplo pulsando en: ORDENAR RANGO MEDIANTE SELECCIÓN

 

Comparte este post

6 comentarios en «ORDENAR UN RANGO MEDIANTE SELECCIÓN»

  1. Considero que expresas tus ideas muy bien. Son muy claras y precisas!
    Y las entiendo muy bien!!

    Pregunta:
    Y si necesito ordenar columnas de acuerdo a mis criterios…?
    Es decir, seleccionar las columnas de manera que queden ordenadas de manera selectiva.

    A mi se me ocurrió el insertar una fila y colocar un numero que indique el oredn de ordenamiento de cada columna, despues ordenas por columna con el comando Ordenar y posteriormente eliminar la fila que habia insertado.

    De hecho me funcionó, pero cuando lo intenté hacer en otro archivo, mi macro falló, debido a que buscaba la hoja original.

    Me puedes ayudar por favor…?

    Saludos desde el D.F. México.

  2. Hola Francisco,

    Según lo que comentas, lo que necesitas es ordenar columnas de forma independiente, es decir, que el orden de una columna no afecte al orden del resto de columnas, ¿es así?.

    Para hacer eso, puede hacerlo modificando la macro anterior y en la línea Set rRango = Selection.EntireRow eliminar «EntireRow». De forma que solo ordenará la selección y no la fila entera, de esta forma puedes ordenar solamente la columna en la que estás y no afectará al rango de las demás.

    Por otra parte, en un post anterior comento un código para ordenar columnas de forma independiente que puede resultar de tu interés: https://excelsignum.com/2015/06/07/ordenar-columnas-de-forma-independiente/

    Espero haberte ayudado. Saludos.

  3. ¿Y para ordenar ese mismo rango de filas (las que están seleccionadas) según diferentes criterios de ordenación?
    Por ejemplo: lo quiero ordenar ASCENDENTE, primero según la Columna B, segundo según la C y tercero según la D.
    Muchas gracias

  4. Buenas,

    Estoy intentando aplicar la macro Sub ORDENAR ()

    y me da error 1004 en la ejecución: error en el método Sort de la clase range.

    ¿Por que es debido?

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