FILTRAR POR AÑO EN UN FILTRO CON VBA

Hola a todos!!

Hace unos días publiqué la forma de filtrar por meses utilizando el filtro de Excel con VBA: FILTRAR POR MES EN UN FILTRO CON VBA

Pues bien, hace un par de días un lector me preguntaba cómo podría filtrar pero por años en lugar de meses. La respuesta es que lo podemos hacer, siempre y cuando las opciones del filtro dinámico no nos sean de utilidad (os recomiendo leer el post anterior), dado que podemos filtrar por el año actual, el próximo o el anterior.

Pero si lo que queremos es obtener es todas la fechas en un determinado año, el que sea, entonces lo debemos realizar de forma distinta.

Vamos a emplear la siguiente macro, es importante indicar que para este ejemplo, a diferencia del anterior voy a utilizar un evento de hoja cuando se modifique el contenido de una celda, en la que vamos a especificar el año:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iDate As Date, fDate As Date, Año As Variant
Dim fin As Long
With Worksheets("Hoja1")
'Si modificamos valor en celda F1, entonces ejecutamos código
If Target.Address = "$F$1" Then
Año = .Range("F1")
'Si la F1 está vacío o no es numérico mostramos
'todos los datos y salimos del proceso
If Año = vbNullString Or Not IsNumeric(Año) Then
AutoFilter.ShowAllData
Exit Sub
End If
'Capturamos inicio y fin del año indicado
iDate = DateSerial(Año, 1, 1)
fDate = DateSerial(Año, 12, 31)
'Filtramos por todas las fechas de ese año
fin = Application.CountA(.Range("A:A"))
.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=">=" & iDate, Operator:=xlAnd, Criteria2:="<" & fDate + 1
End If
End With
End Sub

Imaginad estas fechas:

FILTRAR POR AÑO EN UN FILTRO CON VBA

Si aplicamos la macro y en la celda “F1” ponemos, por ejemplo: 2014, se mostrarán todas las fechas que contengan ese año:

FILTRAR POR AÑO EN UN FILTRO CON VBA_1

Tal y como podéis ver en el código, dato que no disponemos de constantes para los años (sería imposible), tenemos que hacerlo construyendo nuestro propio rango de fechas, es decir, del 01/01/ (y el año que indiquemos) y 31/12/(y el año que indiquemos):

iDate = DateSerial(Año, 1, 1)
fDate = DateSerial(Año, 12, 31)

Y con estas dos variables podemos incluirlas en los criterios de nuestro filtro:

.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=">=" & iDate, Operator:=xlAnd, Criteria2:="<" & fDate + 1

Es importante hacer notar que el +1 del final es para indicar que la fecha sea menor que 01/01/ (año siguiente al indicado) para conseguir el 31/12/(del año indicado). EL motivo es que el <= no funciona como criterio2 (no he conseguido saber el motivo, pero lo averiguaré).

El resto de la macro sirve para controlar que los datos introducidos no sean alfanuméricos o vacíos (si lo son, se muestran todos los datos). Y para ejecutar la macro si la celda F1 se modifica.

Y eso es todo, espero que os haya resultado de interés y que la duda quede resuelta.

Descarga el archivo de ejemplo pulsando en: FILTRAR POR AÑO EN UN FILTRO CON VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Anuncios

¿Te ha gustado?, Realiza un comentario.

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.