VBA Access: Filtro de fechas entre, desde y hasta, igual a, ambas inclusive

Partiendo del filtro:

If IsNull(vFecha1) And IsNull(vFecha2) Then
ElseIf Not IsNull(vFecha1) And IsNull(vFecha2) Then '3
    miFiltro = miFiltro & " AND [INGRESO] >= #" & vFecha1 & "#"
ElseIf IsNull(vFecha1) And Not IsNull(vFecha2) Then '4
    miFiltro = miFiltro & " AND [INGRESO] <= #" & vFecha2 & "#"
ElseIf vFecha1 = vFecha2 Then '5
    miFiltro = miFiltro & " AND [INGRESO] LIKE #" & vFecha1 & "#"
Else '6
    miFiltro = miFiltro & " AND [INGRESO] BETWEEN #" & vFecha1 & "# AND #" & vFecha2 & "#"
End If

intento obtener ambas fechas inclusive pero no lo hace e incluso los filtros no funcionan en ocasiones. Es insólito que a veces funcione y otras no. Cabe aclarar que las fechas se obtienen desde un SQL por lo que se almacenan como mm/dd/yyyy y no como dd/mm/yyyy.

En este último no incluye del 15/08/2017.

Aquí está entre el 11/08/2017 y el 15/08/2017 ¡Y ME INCLUYE EL 16/08/2017!

¿Qué debo hacer para que me filtre correctamente?

Respuesta

Como dice Jaime Segura, es posible que vFecha1 y vFecha2 no estén en el formato correcto, o que no las esté interpretando como fechas válidas...

Te sugiero usar la función "cDate(vFechaX)" para que VBA considere las fechas en su formato correspondiente.

Como verás en el otro comentario (mi respuesta, para mayor precisión), ya lo he usado. Quizá hay algo en cómo lo uso que no se compatibiliza. Entiendo que se guarda como mm/dd/yyyy mediante el Query.
Ahora, cuando lo "levanto" en el formulario, se muestra dd/mm/yyyy... Entonces, cómo hacer para que se use de una u otra forma. Porque ingreso en el filtro como uno u otro formato y me obtiene diferentes resultados y tan dispares que no sé cómo hacer para que funcione de una única forma. El usuario podría no saber cómo ingresar la fecha y se limirará a dd/mm/yyyy entonces debo hacer que funcione de esa forma solamente.

Además, el problema que más me molesta en este momento es que NUNCA incluye en el resultado las fechas vFecha1 y vFecha2.

Si NUNCA se incluye el resultado esperado, significa que el filtro no está cumpliendo con su objetivo.- Es casi seguro, que está mal, bien sea por el formato de las fechas, o bien sea porque es nulo.

Lo primero que me sorprende, es ver una sentencia If... ElseIF.- Por lo que veo, te intentas asegurar bien que las fechas no estén nulas... Haces una comparativa redundante, pero ¿Qué pasa si te llegan en Blanco?

Mi sugerencia para tramo de programa sería esta:

 miFiltro=Null   'Ajustas a nulo el filtro, por si lleva algo de antes'
If IsDate(vFecha1) And IsDate(vFecha2) Then   'Verificas que son fechas'
    miFiltro = miFiltro & " AND [INGRESO] >= Format(cDate(vFecha1,"\#mm/dd/yyyy\#")    '\ =Obliga a mostrar el caracter #
End if 
 Exit sub 'Si no quieres que continue la ejecución del programa---
If IsNull(vFecha1) And Not IsNull(vFecha2) Then '4
    miFiltro = miFiltro & " AND [INGRESO] <=Format(cDate(vFecha2,"\#mm/dd/yyyy\#")
End if 
 Exit Sub
If vFecha1 = vFecha2 Then '5
    miFiltro = miFiltro & " AND [INGRESO] LIKE Format(cDate(vFecha1,"\#mm/dd/yyyy\#")
Else '6
    miFiltro = miFiltro & " AND [INGRESO] BETWEEN Format(cDate(vFecha1,"\#mm/dd/yyyy\#") AND Format(cDate(vFecha2,"\#mm/dd/yyyy\#")
End If

Creo que este código es más simple y te permitirá detectar más pronto el error....

El filtro ya es analizado como nulo en otra sección del filtro (filtra por dos campos más, en combinación con las fechas). Y el objetivo es que busque según qué se haga: si lleno Desde, la búsqueda será a partir de; si sólo lleno Hasta, la búsqueda será hasta X. Si ambas fechas tienen datos, busca entre las fechas y si son iguales, la búsqueda exacta.
Ahora, lo que me llama la atención es que, si uso ese mismo filtro en otra base de datos con las mismas características (formato de fecha, etc.), el BETWEEN me obtiene las fechas entre e incluye las fechas dadas. Es como si fuese un capricho del código que me molesta. Me hace bullying. jajajaja

Quizás hayas descubierto un "Bug" del VBA y resulte que tal y como lo haces, falle... No sería la primera vez que los bugs aparecen así...

;-)

1 respuesta más de otro experto

Respuesta

Puede ser que las fechas estén siendo interpretadas en orden inverso a lo que supones

si 15/08/2017 Access lo lee MM/DD/YYYY entonces para él será 8/03/2018, tendrías que desarmar y armar la fecha al formato adecuado...

Aunque veo algunos de tus ejemplos en los que mi ejemplo explicaría las cosas y otros en los que no...

¿Por qué no pruebas obtener los valores "reales" que tiene Access en las fechas que ves?...

Si una el valor de fecha de una textbox lo multiplicas por 1... verás un número de serie... como se puede hacer en Excel cuando quitas formatos... así podrías ver si 15/08/2017 y 16/08/2017 son dos números consecutivos (42962 y 42963) o no... Si lo son, teoricamente eso va bien... Compara estos valores, tanto de tu filtro como de tu base de datos.

Quizas, dependiendo de tu configuración de Access, necesitas hacer lo contrario, números que ves bien, invertirlos para que la consulta (el filtro) los reciba al revés (pues así los espera).

La otra posibilidad que se me ocurre, es que en realidad las fechas esten siendo interpretadas perfectamente y en realidad tu problema sea el filtro...

Veo que tu concatenas el filtrado de fechas a "mifiltro" ... por lo que supongo que ya podría haber un filtro previo... en ese caso tienes que estar seguro que la agrupación lógica está configurándose como tu quieres... (estos problemas existen normalmente cuando se utilizan algún criterio O)

En Excel existe la posibilidad de convertir las funciones Y y O en * y +, con lo cual se aplica la regla aritmetica que dice que las multiplicaciones se ejecutan antes que la suma.

Ejemplo

=  a*b+c*d                   ==>   primero hacen las dos multiplicaciones y luego recien la suma

si quiero sumar    x+y   y luego multiplicar todo por z

x+y*z    no es lo correcto

(x+y)*z   si

igual es en lógica

a Y b O c     primero evalua  a Y B     y luego todo contra   B

a O b    Y   c      primero es b Y c,

(a O b) y c     primero es a O b

No veo el resto de tu código, ni el filtro... verifica que no se esté creando una cadena de filtro en la que se cree una cadena que pueda generar este problema.

Ojala en algo de esto encuentres una idea...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas