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:
Si aplicamos la macro y en la celda «F1» ponemos, por ejemplo: 2014, se mostrarán todas las fechas que contengan ese año:
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.
¡¡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
Cómo indico cuando el valor buscado no lo encuentro?
No puedes, es igual que cuando filtrar y no se muestran resultados. No existe un mensaje que advierta esto.
Se podría implementar un msgbox vinculado a un if condicional y si en la celda A2 no hay datos entonces muestre el mensaje que no hay resultados.
Saludos.