Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Ordenar y filtrar datos | Automatización de Tablas e Informes
Excel VBA para Automatización Empresarial

Ordenar y filtrar datos

Desliza para mostrar el menú

El filtrado reduce lo que es visible sin modificar los datos subyacentes; es fundamental para crear un informe que solo muestre un mes o una región a la vez.

Figura 4.2

Filtro automático básico

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter no elimina ni mueve ningún dato; simplemente oculta las filas que no coinciden, exactamente como si hubieras hecho clic en la flecha desplegable y desmarcado todo excepto January manualmente. Field:=1 cuenta las columnas comenzando desde 1 dentro de la propia tabla (Month, Region, Sales, Expenses, Profit, Target — por lo tanto, Region sería Field:=2, Profit Field:=5), por lo que esta línea debe mantenerse sincronizada si alguna vez se reordenan las columnas.

Filtros con múltiples condiciones

Filtrar por más de un valor en la misma columna requiere xlFilterValues y un array de criterios:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Compáralo con el filtro de un solo valor anterior: Criteria1 ahora contiene un Array(...) de valores aceptables en lugar de una sola cadena, y Operator:=xlFilterValues es lo que indica a AutoFilter que trate ese array como una lista de coincidencias en lugar de intentar interpretarlo como una sola expresión de criterio. Si omites Operator:=xlFilterValues, esta línea dará error o se comportará de manera inesperada; es fácil olvidarlo y vale la pena revisarlo siempre que Criteria1 sea una lista.

Filtrar por una condición numérica — por ejemplo, solo las filas donde Profit supere Target por un margen considerable — utiliza operadores de comparación en su lugar:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Observa que ">15000" está escrito como texto entre comillas aunque sea una comparación numérica; AutoFilter siempre espera Criteria1 como una cadena y analiza el símbolo > por sí mismo. Escribir Criteria1:=15000 sin el > filtraría solo las filas exactamente iguales a 15000 en lugar de las mayores, lo cual es un error común y fácil de cometer.

Ordenación

El objeto Sort admite varias claves, exactamente igual que el cuadro de diálogo Data → Sort:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear se ejecuta primero para que las claves de ordenación sobrantes de una ejecución anterior de la macro (o de un usuario que haya ordenado manualmente la tabla antes) no se combinen silenciosamente con las nuevas; siempre limpia antes de agregar. El orden en que aparecen las dos llamadas .Add2 importa tanto como sus configuraciones Order:=xlAscending/xlDescending: la primera añadida se convierte en la clave de ordenación principal (Month) y la segunda en el criterio de desempate dentro de cada grupo (Profit, el mayor primero dentro de cada mes). .Header = xlYes indica a Excel que la fila 1 es un encabezado y nunca debe moverse al ordenar; .Apply es lo que realmente ejecuta la ordenación; todo lo anterior solo construye las instrucciones.

Limpiar filtros

Siempre limpia los filtros al inicio de una macro de informe, para que cada ejecución comience desde un estado conocido y sin filtrar:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode es un valor booleano que es True siempre que algún filtro esté restringiendo las filas visibles de la tabla; comprobarlo primero evita un error de ejecución, ya que llamar a ShowAllData cuando no hay nada filtrado genera un error en lugar de no hacer nada.

Tarea

  1. Escribir una macro que filtre tblReports solo para febrero, usando AutoFilter Field:=1.
  2. Ampliar para filtrar la Región (Field:=2) solo a "East" y "West" al mismo tiempo, usando xlFilterValues.
  3. Borrar ambos filtros, luego ordenar la tabla por Región en orden ascendente y luego por Profit en orden descendente, utilizando el objeto Sort mostrado arriba.
Pista
expand arrow

1. Filtrar a febrero

  • Field:=1 se refiere a la primera columna de la tabla, no de la hoja de cálculo — Month es la columna 1 dentro de tblReports, sin importar en qué columna de la hoja se encuentre físicamente.
  • Criteria1 toma el texto exacto por el que se filtra, entre comillas.
  • Se llama a AutoFilter sobre tbl.Range, no directamente sobre la hoja de cálculo.

2. Agregar el filtro de Región

  • Region es la segunda columna de la tabla, por lo que ese es un número de Field:= diferente al filtro de Month.
  • Filtrar por dos valores en la misma columna requiere Criteria1:=Array(...) con ambos valores dentro, además de Operator:=xlFilterValues — omitir ese operador es el error más común aquí.
  • Ambos filtros (Month y Region) pueden estar activos al mismo tiempo — simplemente llama a AutoFilter dos veces, una por columna.

3. Borrar filtros y ordenar

  • Verifica tbl.AutoFilter.FilterMode antes de llamar a ShowAllData — llamarlo cuando no hay filtros activos genera un error.
  • El objeto Sort necesita .SortFields.Clear primero, luego un .SortFields.Add2 por cada nivel de ordenamiento — el orden en que los agregas decide cuál es la clave primaria y cuál es el criterio de desempate, no el orden en que aparecen en la tabla.
  • Región ascendente debe agregarse antes que Profit descendente, ya que Región debe ser el orden principal.
Solución
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Ejecuta FilterFebruaryEastWest y deberías ver solo las filas de febrero para las regiones East y West visibles. Luego ejecuta ClearFiltersAndSort — todas las filas reaparecen, ordenadas primero por Región (alfabéticamente), y dentro de cada Región, el Profit más alto aparece primero.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 2

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Ordenar y filtrar datos

El filtrado reduce lo que es visible sin modificar los datos subyacentes; es fundamental para crear un informe que solo muestre un mes o una región a la vez.

Figura 4.2

Filtro automático básico

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter no elimina ni mueve ningún dato; simplemente oculta las filas que no coinciden, exactamente como si hubieras hecho clic en la flecha desplegable y desmarcado todo excepto January manualmente. Field:=1 cuenta las columnas comenzando desde 1 dentro de la propia tabla (Month, Region, Sales, Expenses, Profit, Target — por lo tanto, Region sería Field:=2, Profit Field:=5), por lo que esta línea debe mantenerse sincronizada si alguna vez se reordenan las columnas.

Filtros con múltiples condiciones

Filtrar por más de un valor en la misma columna requiere xlFilterValues y un array de criterios:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Compáralo con el filtro de un solo valor anterior: Criteria1 ahora contiene un Array(...) de valores aceptables en lugar de una sola cadena, y Operator:=xlFilterValues es lo que indica a AutoFilter que trate ese array como una lista de coincidencias en lugar de intentar interpretarlo como una sola expresión de criterio. Si omites Operator:=xlFilterValues, esta línea dará error o se comportará de manera inesperada; es fácil olvidarlo y vale la pena revisarlo siempre que Criteria1 sea una lista.

Filtrar por una condición numérica — por ejemplo, solo las filas donde Profit supere Target por un margen considerable — utiliza operadores de comparación en su lugar:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Observa que ">15000" está escrito como texto entre comillas aunque sea una comparación numérica; AutoFilter siempre espera Criteria1 como una cadena y analiza el símbolo > por sí mismo. Escribir Criteria1:=15000 sin el > filtraría solo las filas exactamente iguales a 15000 en lugar de las mayores, lo cual es un error común y fácil de cometer.

Ordenación

El objeto Sort admite varias claves, exactamente igual que el cuadro de diálogo Data → Sort:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear se ejecuta primero para que las claves de ordenación sobrantes de una ejecución anterior de la macro (o de un usuario que haya ordenado manualmente la tabla antes) no se combinen silenciosamente con las nuevas; siempre limpia antes de agregar. El orden en que aparecen las dos llamadas .Add2 importa tanto como sus configuraciones Order:=xlAscending/xlDescending: la primera añadida se convierte en la clave de ordenación principal (Month) y la segunda en el criterio de desempate dentro de cada grupo (Profit, el mayor primero dentro de cada mes). .Header = xlYes indica a Excel que la fila 1 es un encabezado y nunca debe moverse al ordenar; .Apply es lo que realmente ejecuta la ordenación; todo lo anterior solo construye las instrucciones.

Limpiar filtros

Siempre limpia los filtros al inicio de una macro de informe, para que cada ejecución comience desde un estado conocido y sin filtrar:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode es un valor booleano que es True siempre que algún filtro esté restringiendo las filas visibles de la tabla; comprobarlo primero evita un error de ejecución, ya que llamar a ShowAllData cuando no hay nada filtrado genera un error en lugar de no hacer nada.

Tarea

  1. Escribir una macro que filtre tblReports solo para febrero, usando AutoFilter Field:=1.
  2. Ampliar para filtrar la Región (Field:=2) solo a "East" y "West" al mismo tiempo, usando xlFilterValues.
  3. Borrar ambos filtros, luego ordenar la tabla por Región en orden ascendente y luego por Profit en orden descendente, utilizando el objeto Sort mostrado arriba.
Pista
expand arrow

1. Filtrar a febrero

  • Field:=1 se refiere a la primera columna de la tabla, no de la hoja de cálculo — Month es la columna 1 dentro de tblReports, sin importar en qué columna de la hoja se encuentre físicamente.
  • Criteria1 toma el texto exacto por el que se filtra, entre comillas.
  • Se llama a AutoFilter sobre tbl.Range, no directamente sobre la hoja de cálculo.

2. Agregar el filtro de Región

  • Region es la segunda columna de la tabla, por lo que ese es un número de Field:= diferente al filtro de Month.
  • Filtrar por dos valores en la misma columna requiere Criteria1:=Array(...) con ambos valores dentro, además de Operator:=xlFilterValues — omitir ese operador es el error más común aquí.
  • Ambos filtros (Month y Region) pueden estar activos al mismo tiempo — simplemente llama a AutoFilter dos veces, una por columna.

3. Borrar filtros y ordenar

  • Verifica tbl.AutoFilter.FilterMode antes de llamar a ShowAllData — llamarlo cuando no hay filtros activos genera un error.
  • El objeto Sort necesita .SortFields.Clear primero, luego un .SortFields.Add2 por cada nivel de ordenamiento — el orden en que los agregas decide cuál es la clave primaria y cuál es el criterio de desempate, no el orden en que aparecen en la tabla.
  • Región ascendente debe agregarse antes que Profit descendente, ya que Región debe ser el orden principal.
Solución
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Ejecuta FilterFebruaryEastWest y deberías ver solo las filas de febrero para las regiones East y West visibles. Luego ejecuta ClearFiltersAndSort — todas las filas reaparecen, ordenadas primero por Región (alfabéticamente), y dentro de cada Región, el Profit más alto aparece primero.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 2
some-alt