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.
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
- Escribir una macro que filtre tblReports solo para febrero, usando
AutoFilter Field:=1. - Ampliar para filtrar la Región (Field:=2) solo a "East" y "West" al mismo tiempo, usando
xlFilterValues. - 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.
1. Filtrar a febrero
Field:=1se refiere a la primera columna de la tabla, no de la hoja de cálculo — Month es la columna 1 dentro detblReports, sin importar en qué columna de la hoja se encuentre físicamente.Criteria1toma el texto exacto por el que se filtra, entre comillas.- Se llama a
AutoFiltersobretbl.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 deOperator:=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
AutoFilterdos veces, una por columna.
3. Borrar filtros y ordenar
- Verifica
tbl.AutoFilter.FilterModeantes de llamar aShowAllData— llamarlo cuando no hay filtros activos genera un error. - El objeto
Sortnecesita.SortFields.Clearprimero, luego un.SortFields.Add2por 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.
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.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
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.
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
- Escribir una macro que filtre tblReports solo para febrero, usando
AutoFilter Field:=1. - Ampliar para filtrar la Región (Field:=2) solo a "East" y "West" al mismo tiempo, usando
xlFilterValues. - 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.
1. Filtrar a febrero
Field:=1se refiere a la primera columna de la tabla, no de la hoja de cálculo — Month es la columna 1 dentro detblReports, sin importar en qué columna de la hoja se encuentre físicamente.Criteria1toma el texto exacto por el que se filtra, entre comillas.- Se llama a
AutoFiltersobretbl.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 deOperator:=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
AutoFilterdos veces, una por columna.
3. Borrar filtros y ordenar
- Verifica
tbl.AutoFilter.FilterModeantes de llamar aShowAllData— llamarlo cuando no hay filtros activos genera un error. - El objeto
Sortnecesita.SortFields.Clearprimero, luego un.SortFields.Add2por 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.
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.
¡Gracias por tus comentarios!