En una gran tabla de datos, a Ed le gustaría poder escanear rápidamente y ver si una columna en particular se está filtrando activamente. Se pregunta si hay alguna forma de aplicar formato condicional para cambiar el color de fondo de una columna cuando hay un filtro en juego que se basa en esa columna.

Hay algunas formas de abordar esta tarea. Todos ellos involucran macros, y el propósito de cada macro es determinar si hay un filtro en juego para una columna en particular. Una opción es crear una función que examine la hoja de trabajo en busca de un filtro y, si encuentra uno en su lugar, verificar cada columna en el área filtrada para ver si hay un filtro en juego en esa columna. La siguiente macro hace precisamente eso.

Sub ColorFilterColumn()

Dim flt As Filter     Dim iCol As Integer     Dim lRow As Long     Dim rTemp As Range     Dim bFullCol As Boolean

' Set as True if you want entire column shaded     bFullCol = False

If ActiveSheet.AutoFilterMode Then         iCol = ActiveSheet.AutoFilter.Range.Column         lRow = ActiveSheet.AutoFilter.Range.Row         Application.EnableEvents = False         For Each flt In ActiveSheet.AutoFilter.Filters             If bFullCol Then                 Set rTemp = Cells(lRow, iCol).EntireColumn             Else                 Set rTemp = Cells(lRow, iCol)

End If

If flt.On Then                 rTemp.Interior.Color = vbYellow             Else                 rTemp.Interior.ColorIndex = xlColorIndexNone             End If

Set rTemp = Nothing             iCol = iCol + 1         Next flt         Application.EnableEvents = True     End If End Sub

Si la macro localiza un filtro que está funcionando, resalta (en amarillo) la primera celda de la tabla filtrada o toda la columna que tiene el filtro. La determinación de si se resalta una celda o toda la columna se basa en el valor Verdadero / Falso asignado a la variable bFullCol.

Si lo prefiere, puede crear una función que devuelva Verdadero o Falso en función de si un filtro está en vigor para una columna en particular. Con dicha función, podría crear una regla de formato condicional que formatee la columna en función del valor devuelto.

Function bHasFilter(rcell As Range) As Boolean     Dim lBaseCol As Long     Dim lCol As Long

Application.Volatile     bHasFilter = False

If ActiveSheet.AutoFilterMode Then         With ActiveSheet.AutoFilter             lBaseCol = .Range.Column             lCol = rcell.Column - lBaseCol + 1             If lCol > 0 And lCol <= .Filters.Count Then                 If .Filters(lCol).On Then bHasFilter = True             End If         End With     End If End Function

Para usar esta función, simplemente use una fórmula como la siguiente en su hoja de trabajo o en la regla de formato condicional:

=bHasFilter(F23)

La función primero verifica si hay un filtro en efecto. Si es así, calcula si la columna de la celda pasada a la fórmula está dentro del rango de columnas filtradas. (La fila a la que se hace referencia en la fórmula realmente no importa). Si es así, verifica si el filtro está activado para esa columna.

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (13410) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365.