Está en la página 1de 6

Cómo ordenar datos en Excel usando VBA (Guía paso a paso)

-- Por Sumit Bansal


Excel ya tiene un par de formas de ordenar los datos rápidamente.
Puede ordenar fácilmente un conjunto de datos mediante los iconos de ordenación de la cinta
de opciones o el cuadro de diálogo de ordenación.

Entonces, ¿por qué necesita saber cómo hacer esto usando VBA?
Saber cómo ordenar datos usando VBA puede ser útil cuando se incluye como parte de su
código. Por ejemplo, supongamos que obtiene un conjunto de datos diario/semanal que
necesita para formatear y ordenar en un orden específico.
Puede crear una macro para hacer todo esto por usted con un solo clic. Eso te ahorrará mucho
tiempo y esfuerzo cada vez que lo hagas.
Además, si crea paneles de Excel, puede llevar la capacidad de clasificación de Excel a un
nuevo nivel al permitir que el usuario ordene los datos simplemente haciendo doble clic en el
encabezado (como se muestra a continuación).

Cubriré cómo crear esto más adelante en este tutorial. Primero aclaremos rápidamente los
conceptos básicos.
Este tutorial cubre:
 Descripción del método Range.Sort en VBA de Excel
 Ordenar una sola columna sin encabezado
 Ordenar una sola columna con encabezado
 Ordenar varias columnas con encabezados
 Ordenar datos haciendo doble clic en el encabezado
Descripción del método Range.Sort en VBA de Excel
Al ordenar con VBA, debe usar el método Range.Sort en el código.
El 'Range' serían los datos que está tratando de ordenar. Por ejemplo, si está ordenando los
datos en A1:A10, 'Range' sería Range("A1:A10").
También puede crear un range con nombre y utilizarlo en lugar de las referencias de celda.
Por ejemplo, si creo un rango con nombre 'DataRange' para las celdas A1:A10, también puedo
usar Range("DataRange")

Página 1 de 6
Con el método de ordenación, debe proporcionar información adicional a través de
parámetros. A continuación se presentan los parámetros clave que necesita saber:
 Key: aquí debe especificar la columna que desea ordenar. Por ejemplo, si desea ordenar la
columna A, debe usar la key:=Rango("A1")
 Order: aquí se especifica si desea la ordenación en orden ascendente o descendente. Por
ejemplo, si desea que la ordenación esté en orden ascendente, usará Order:=xlAscending
 Header: aquí especifica si su conjunto de datos tiene encabezados o no. Si tiene encabezados,
la ordenación comienza desde la segunda fila del conjunto de datos, de lo contrario comienza
desde la primera fila. Para especificar que los datos tienen encabezados, utilizará
Header:=xlYes
Si bien estos tres son suficientes en la mayoría de los casos, puede leer más sobre los
parámetros en este artículo.
Ahora veamos cómo usar el método Range.Sort en VBA para ordenar datos en Excel.
Ordenar una sola columna sin encabezado
Supongamos que tiene una sola columna sin encabezado (como se muestra a continuación).

Puede usar el siguiente código para ordenarlo en orden ascendente.


Sub SortDataWithoutHeader()
Range("A1:A12").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
End Sub

Tenga en cuenta que he especificado el rango de datos manualmente como Range("A1:


A12").
En caso de que haya cambios en los datos y se agreguen o eliminen valores, puede usar el
siguiente código que se ajusta automáticamente en función de las celdas rellenas del conjunto
de datos.
Sub SortDataWithoutHeader()
Range("A1", Range("A1").End(xlDown)).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
End Sub

Tenga en cuenta que en lugar de Range("A1:A12"), he usado, Range("A1", Rango("A1").


End(xlDown)).
Esto comprobará la última celda rellenada consecutivamente en la columna y la incluirá en la
ordenación. En caso de que haya espacios en blanco, solo considerará los datos hasta la
primera celda en blanco.
También puede crear un rango con nombre y utilizarlo en lugar de las referencias de celda.
Por ejemplo, si el rango con nombre es DataSet, el código ahora sería como se muestra a
continuación.
Sub SortDataWithoutHeader()
Range("DataRange").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
End Sub

Ahora permítanme explicar rápidamente los parámetros utilizados en los ejemplos anteriores:
 Key1:=Range(“A1”) – Se especificó A1 para que el código supiera qué columna ordenar.
Página 2 de 6
 Order1:=xlAscending – Se especificó el orden como xlAscending. Si quieres que esté en
orden descendente, use xlDescending.
 Header:= xlNo – Se ha especificado que no hay encabezados. Este es también el valor
predeterminado. Entonces, incluso si omite esto, sus datos se ordenarán teniendo en cuenta que
no tienen encabezados..
¿Se pregunta dónde colocar este código VBA y cómo ejecutar la macro? ¡Lea este tutorial!
Ordenar una sola columna con encabezado
En el ejemplo anterior, el conjunto de datos no tenía un encabezado.
Cuando los datos tienen encabezados, debe especificarlos en el código para que la ordenación
pueda comenzar desde la segunda fila del conjunto de datos.
Supongamos que tiene un conjunto de datos como se muestra a continuación:

A continuación se muestra el código que ordenará los datos en orden descendente en función
de las ventas de las tiendas.
Sub SortDataWithHeader()
Range("DataRange").Sort Key1:=Range("C1"), Order1:=xlDescending
End Sub

Tenga en cuenta que he creado un rango con nombre: 'DataRange', y he usado este rango con
nombre en el código.
Ordenar varias columnas con encabezados
Hasta ahora en este tutorial, hemos visto cómo ordenar una sola columna (con y sin
encabezados).
Ahora, ¿qué pasa si desea ordenar en función de varias columnas?
Por ejemplo, en el siguiente conjunto de datos, ¿qué sucede si primero quiero ordenar por el
código de estado y luego por el almacén?

Aquí está el código que ordenará varias columnas de una sola vez.
Sub SortMultipleColumns()
With ActiveSheet.Sort

Página 3 de 6
.SortFields.Add Key:=Range("A1"), Order:=xlAscending
.SortFields.Add Key:=Range("B1"), Order:=xlAscending
.SetRange Range("A1:C13")
.Header = xlYes
.Apply
End With
End Sub

A continuación se muestra el resultado que obtendrás.

En el ejemplo anterior, los datos se ordenan primero por el código de estado (columna A).
Luego, dentro de los datos del código de estado, se ordenan nuevamente por la Tienda
(Columna B). Este orden está determinado por el código en el que lo mencionas.
Ordenar datos haciendo doble clic en el encabezado
Si está creando un panel o desea más facilidad de uso en sus informes, puede escribir un
código VBA que ordenará los datos cuando haga doble clic en los encabezados.
Algo como se muestra a continuación:

A continuación se muestra el código que le permitirá hacer esto:


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim KeyRange As Range
Dim ColumnCount As Integer
ColumnCount = Range("DataRange").Columns.Count
Cancel = False
If Target.Row = 1 And Target.Column <= ColumnCount Then
Cancel = True
Set KeyRange = Range(Target.Address)
Range("DataRange").Sort Key1:=KeyRange, Header:=xlYes
End If
End Sub

Tenga en cuenta que he creado un rango con nombre ("DataRange") y lo he utilizado en el


código en lugar de usar las referencias de celda.
Tan pronto como haga doble clic en cualquiera de los encabezados, el código deshabilita la
funcionalidad habitual de doble clic (que es entrar en el modo de edición) y usa esa celda
como clave al ordenar los datos.

Página 4 de 6
También tenga en cuenta que a partir de ahora, este código ordenará todas las columnas solo
en orden ascendente.
Tenga en cuenta que hacer doble clic es un desencadenador que permite a Excel ejecutar el
código especificado. Estos desencadenadores, como hacer doble clic, abrir un libro de trabajo,
agregar una nueva hoja de cálculo, cambiar una celda, etc., se denominan eventos y se pueden
usar para ejecutar macros en Excel. Puede leer más sobre los eventos de VBA de Excel aquí.
¿Dónde poner este código?
Debe pegar este código en la ventana de código de la hoja en la que desea esta funcionalidad
de ordenación de doble clic.
Para ello:
 Haga clic con el botón derecho en la pestaña de la hoja.
 Haga clic en Ver código.
 Pegue el código en la ventana de código de la hoja en la que residen sus datos.
Ahora, ¿qué pasa si desea ordenar las dos primeras columnas ('Estado' y 'Tienda') en orden
ascendente, pero la columna 'Ventas' en orden descendente?
Aquí está el código que lo hará:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim KeyRange As Range
Dim ColumnCount As Integer
ColumnCount = Range("DataRange").Columns.Count
Cancel = False
If Target.Row = 1 And Target.Column <= ColumnCount Then
Cancel = True
Set KeyRange = Range(Target.Address)
If Target.Value = "Sales" Then
SortOrder = xlDescending
Else
SortOrder = xlAscending
End If
Range("DataRange").Sort Key1:=KeyRange, Header:=xlYes, Order1:=SortOrder
End If
End Sub

En el código anterior, comprueba si la celda en la que se hace doble clic es el encabezado


Sales o no. Si es así, asigna el valor xlDescending a la variable SortOrder, de lo contrario lo
convierte en xlAscending.
Ahora llevemos esto un poco más allá y mostremos un marcador visual (flecha y celda de
color) en el encabezado cuando esté ordenado.
Algo como se muestra a continuación:

Para obtener esto, he agregado una nueva hoja de trabajo y he realizado los siguientes
cambios en ella (puede descargar el archivo de ejemplo y seguirlo):

Página 5 de 6
 Se ha cambiado el nombre de la nueva hoja a 'BackEnd'.
 En la celda B2, ingrese un símbolo de flecha (para hacer esto, vaya a Insertar y haga clic en la
opción 'Símbolo').
 Copie y pegue los encabezados del conjunto de datos en la celda A3:C3 de la hoja 'Backend'.
 Utilice la siguiente función en la celda A4:AC4:
=IF(A3=$C$1,A3&" "&$B$1,A3)

 El resto de las celdas se llenarán automáticamente con el código VBA cuando haga doble clic
en los encabezados para ordenar la columna.
Su hoja de backend se vería algo como se muestra a continuación:

Ahora puede usar el siguiente código para ordenar los datos haciendo doble clic en los
encabezados. Cuando haga doble clic en un encabezado, obtendrá automáticamente la flecha
en el texto del encabezado. Tenga en cuenta que también he utilizado el formato condicional
para resaltar la celda también.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim KeyRange As Range
Dim ColumnCount As Integer
ColumnCount = Range("DataRange").Columns.Count
Cancel = False
If Target.Row = 1 And Target.Column <= ColumnCount Then
Cancel = True
Worksheets("Backend").Range("C1") = Target.Value
Set KeyRange = Range(Target.Address)
Range("DataRange").Sort Key1:=KeyRange, Header:=xlYes
Worksheets("BackEnd").Range("A1") = Target.Column
For i = 1 To ColumnCount
Range("DataRange").Cells(1, i).Value = Worksheets("Backend").Range("A4").Offset(0, i - 1).Value
Next i
End If
End Sub

Tenga en cuenta que este código funciona bien para la forma en que se construyen mis datos y
mi libro. Si cambia la estructura de los datos, tendrá que modificar el código en consecuencia.
Download the Example File
También te pueden gustar los siguientes tutoriales de Excel:
 Sort Worksheets in Excel (Alphabetically)
 How to Filter Data in a Pivot Table in Excel.
 Dynamic Excel Filter Search Box – Extract Data as you Type.
 How to do a Multi-level Data Sorting in Excel.
 Excel Advanced Filter – A Complete Guide with Examples.
 24 Useful Excel Macro Examples for VBA Beginners.
 How to Use Excel VBA InStr Function (with practical EXAMPLES).
 Excel VBA Autofilter.
https://trumpexcel.com/sort-data-vba/
https://trumpexcel.com/?s=how+to+sort+data+in+excel+using+vba

Página 6 de 6

También podría gustarte