FILTRAR POR MES EN UN FILTRO CON VBA

Hola a todos:

Hace unas semanas recibí la siguiente consulta:

… tengo una duda: necesito seleccionar de una base datos (p.e. facturación) todos los datos de un mes en concreto de entre varios años sea del año que sea para pasarlos a otra hoja y poder tratarlos. Automáticamente me da el mes como un array (con las fechas de la selección). ¿Cómo puedo decirle en el array el mes “mayo” por ejemplo?”

Y es que aunque parece algo sencillo, el tema de las fechas y el filtro tiene su complicación. Se trata de seleccionar el mes, no una fecha concreta, para lo cual sí podemos utilizar la grabadora de macros y modificar la fecha que necesitamos.

La solución está en trabajar con filtros dinámicos, de esta forma podremos implementar toda una serie de criterios para obtener no solo el mes, sino más elementos.

Por lo tanto, el operador será el filtro dinámico: Operator:=xlFilterDynamic y con él tendremos los siguientes criterios aplicables:

FILTRAR POR MES EN UN FILTRO CON VBA

En este enlace tenéis más información: Criterios

Para este post pondré un ejemplo de una posible funcionalidad, imaginad que tenemos una serie de fechas y las queremos filtros a través del mes que aparezca en un Combobox:

FILTRAR POR MES EN UN FILTRO CON VBA1

Pues bien, aquí os dejo el código completo con el que vamos a realizar el trabajo:

Private Sub ComboBox1_Change()
'Declaramos variables
Dim MiArray As Variant, nMes As String, Criterio As Variant, fin As Long
'Creamos matriz de meses
MiArray = Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre", " ")
'Cargamos meses en Combobox
Sheets("Hoja1").ComboBox1.List = MiArray
'Con una instrucción select case
'pasamos a la variable Criterio la constante que corresponda
nMes = ComboBox1.Value
Select Case nMes
Case "Enero"
Criterio = xlFilterAllDatesInPeriodJanuary
Case "Febrero"
Criterio = xlFilterAllDatesInPeriodFebruray
Case "Marzo"
Criterio = xlFilterAllDatesInPeriodMarch
Case "Abril"
Criterio = xlFilterAllDatesInPeriodApril
Case "Mayo"
Criterio = xlFilterAllDatesInPeriodMay
Case "Junio"
Criterio = xlFilterAllDatesInPeriodJune
Case "Julio"
Criterio = xlFilterAllDatesInPeriodJuly
Case "Agosto"
Criterio = xlFilterAllDatesInPeriodAugust
Case "Septiembre"
Criterio = xlFilterAllDatesInPeriodSeptember
Case "Octubre"
Criterio = xlFilterAllDatesInPeriodOctober
Case "Noviembre"
Criterio = xlFilterAllDatesInPeriodNovember
Case "Diciembre"
Criterio = xlFilterAllDatesInPeriodDecember
End Select
'Filtramos por el mes seleccionado
With Worksheets("Hoja1")
fin = Application.CountA(.Range("A:A"))
.Select
'Si el criterio está vacío, mostramos todos los datos
'y salimos de la rutina
If Criterio = vbNullString Then
AutoFilter.ShowAllData
Exit Sub
End If
.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=Criterio, Operator:=xlFilterDynamic
End With
End Sub

Para no dejar en la hoja el listado de los meses y luego cargarlos en el combobox, los he incluido en un array en el código.

Luego con un select case le damos al mes seleccionado en el combobox el valor del criterio.

Finalmente filtramos según el criterio seleccionado:

.Range("$A$1:$A$" & fin).AutoFilter Field:=1, _
Criteria1:=Criterio, Operator:=xlFilterDynamic

Por ejemplo, si filtramos por “mayo” obtendremos el siguiente resultado:

FILTRAR POR MES EN UN FILTRO CON VBA2

y eso es todo, así queda la duda aclarada : )

Espero que os sea de utilidad!
Descarga el archivo de ejemplo pulsando en: FILTRAR POR MES 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