lunes, 11 de marzo de 2013

VBA: Una función personalizada que muestra el filtro aplicado.

Algunos días atrás un lector preguntaba si existía alguna forma de conocer qué filtros había aplicados en un listado de datos con el Autofiltro aplicado. Obviamente no le servía la visualización directa mediante la etiqueta informativa del Autofiltro, por lo que para obtener dicho dato se hace necesario aplicar algo de código VBA.
En particular trabajaremos con la propiedad Autofilters.Filters.


Partiremos del siguiente listado de datos, con la herramienta Autofiltro ya aplicada:

VBA: Una función personalizada que muestra el filtro aplicado.


Aplicaremos sobre nuestros dos campos algunos criterios de filtro, por ejemplo sobre el Campo1 mostraremos el elemento 'aa' o el 'cc' y en el Campo2 los valores mayores a 250.
Recordemos, como se ve en la imagen, que pasando el cursor por encima del desplegable del campo filtrado, aparece una etiqueta informando del filtro aplicado:

VBA: Una función personalizada que muestra el filtro aplicado.



Sin embargo queremos algo menos 'temporal', algo que se pueda ver en todo momento y sobre todos los campos filtrados al tiempo. Por ello construiremos una función personalizada en VBA (UDF).
Por tanto accederemos al Editor de VBA (alt+F11) e insertaremos un Módulo, y dentro de él el siguiente código:

Function MuestraCriterio(Campo As Range) As String
Dim criterio1 As String
Dim criterio2 As String
'actualizamos la función para cada cambio en la hoja
Application.Volatile

With Campo.Parent.AutoFilter
    'Analizamos el filtro en la columna filtrada
    With .Filters(Campo.Column - .Range.Column + 1)
        'si el campo no tiene filtro, salimos de la función
        If Not .On Then Exit Function
        'si tiene filtro, asignamos el criterio (criteria1) a nuestra variable
        criterio1 = .Criteria1
        'si el operador es AND(Y) entonces componemos una cadena de texto
        If .Operator = xlAnd Then
        criterio2 = " AND(Y) " & .Criteria2
        'si el operador es OR(O) entonces componemos una cadena de texto
        ElseIf .Operator = xlOr Then
        criterio2 = " OR(O) " & .Criteria2
        End If
    End With
End With
'finalizamos uniendo los criterios obtenidos...
MuestraCriterio = Campo & ": " & criterio1 & criterio2
End Function


Observamos su funcionamiento introduciendo en las celdas B14 y C14 nuestra función. En B14:
=MuestraCriterio(B1)
y en C14
=MuestraCriterio(C1)
Haciendo referencia a las celdas de la cabecera o rótulo de nuestro listado de datos sobre el que hemos aplicado el Autofiltro.
Notemos como la función sólo admite un máximo de dos criterios por campo filtrado, puesto que esta es la limitación de la herramienta Autofiltro.
Vemos en la imagen el resultado:

VBA: Una función personalizada que muestra el filtro aplicado.























No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.