¿Cómo contar registro entre una fecha determinada usando VBA?

Vengo usando este código para contar registros de una base de datos de un mapa microbiológico que estoy haciendo para que me cuente microorganismos, microorganismos por servicios y microorganismos por servicios en un periodo.

Y cada evento se desarrolla bien, excepto el de las fechas (obviamente no sé cómo se hace):

Private Sub postFecha_Change()
Me.cuentaPorFecha = DCount("*", "[regEnterobacterales]", "[microorganismos]=" & Me.enteroOption & " and [servicio] = " & Me.serviOption & " and [fecha]> # " & Me.preFecha & " # and [fecha]< # " & Me.postFecha & " #")
End Sub

Entonce corre error 3000, error reservado (-3201)

Respuesta
1

¿Servicio es texto?. Si así fuera deberías poner la instrucción como

.....servicio='" & me.servioption & "'....

Otra cosa que me sorprende es ¿en el evento Al cambiar?

Podrías poner una imagen

Es una caja de Opciones

por qué le sorprende lo del evento al cambiar? qué me sugiere?

Lo normal, pero no quiero decir que sea una respuesta absoluta, es ponerlo en el evento Después de actualizar del cuadro de texto PostFecha, de forma que escribes una fecha y al pulsar Enter o "irse" el cursor de ese cuadro de texto te "actúe" como filtro.

2 respuestas más de otros expertos

Respuesta
3

Otra alternativa

Private Sub postFecha_Change()
    Me.cuentaPorFecha = DCount("*", "[regEnterobacterales]", "[microorganismos]=" & Me.enteroOption & " and [servicio] = " & Me.serviOption & " and [fecha]> #" & Format(Me.preFecha, "yyyy-mm-dd") & "# and [fecha]< #" & Format(Me.postFecha, "yyyy-mm-dd") & "#")
End Sub

¡Gracias! 

solo por aprender: 

Format(Me.postFecha, "yyyy-mm-dd")

¿qué otras sintaxis hay según el tipo de formato?

Respuesta
1

La respuesta corta:

Utilizar 'entre' para obtener el periodo y para evitar errores de 'libre conversión' darle el dato adecuado (las fechas convertidas a numero).

Si el dato esta en una tabla en un campo de tipo fecha (y con parte horaria o sin ella):

(Tomo solo la parte que afecta a las fechas:
Original:

... & Me.serviOption & " and [fecha]> # " & Me.preFecha & " # and [fecha]< # " & Me.postFecha & " #") 

Alternativa:

... & Me.serviOption & " and [fecha] Between " & CDbl( Me.preFecha) & " and  " & CDbl(Me.postFecha))

Si las fechas se tomasen de cuadros de texto (20/5/2023 o 20 may 2023 ...)

... & Me.serviOption & " and [fecha] Between " & CDbl(CDate(Me.preFecha)) & " and " & CDbl(CDate(Me. PostFecha)))

Hay quien se conforma con darle formato americano a la fecha local (pero no evita los errores de interpretación de Access y su lio con meses y días si no tiene clara la procedencia del dato).

¡Gracias! 

CDbl(CDate())

para qué es?

ahora da error 94 como si tomara un valor null

xd

CDate es una función que convierte 'en fecha Access' (numero) a cualquier interpretación de fecha de las que reconozca la configuración regional del sistema WIndows

Por ejemplo:
6 pm = 18 horas = 18/24 =  0,75

Con días:
20/4/2023  = 20/04/2023 = 20 abr 2023 = 20 abril 2023 ..etc.

CDbl es una función que convierte un valor numérico a su representación decimal (una fecha para el ordenador es un numero)

En la ventana de inmediato:
?CDate("4/5/2023")
04/05/2023
?CDbl(CDate("4/5/2023"))
45050

XXX= Now
?xxx
01/07/2023 14:24:54
? Cdbl(xxx)
45108,600625

¿

? Format( 45108.600625,"Long date")
Sábado, 1 de julio de 2023

Las fechas (para Access) son números a los que trata de forma especial (los disfraza para representarlos según la zona)
En ese numero la parte entera son los días y la decimal la parte del día transcurrido (que en cuanto alcanza la unidad se convierte en un día mas)

Se deberá utilizar ambas funciones si la fecha es un texto (si esta en una tabla en un campo Date, ya esta en formato numérico y bastara con CDbl).

Se esta utilizando el evento CHANGE y no es el adecuado, pues mientras no se alcance el evento antes/después de actualizar, en ese campo no existirá un dato (mantendrá el de origen, posiblemente un NULL) su valor temporal esta en la propiedad Text: Me.PostFecha.Text

Pero al tratarse de una fecha, si no esta completa dará error (change = cambio) y cambia al escribir uno a uno los caracteres en el cuadro de texto y por ello se utiliza la propiedad TEXT, al finalizar de introducir los datos, su valor pasara a la propiedad Value y el valor de/en Value a la propiedad OldValue

¡Gracias! Sirvió de maravilla. Solo cambié el evento ("al actualizar") y funciona. No sabría que habría hecho sin uds. 

Respecto a los diferentes formatos que pueden utilizarse con 'Format', el adecuado es el americano (mm/dd/yyyy) el japones (yyyy/mm/dd) y cualquiera otro que no le complique, por ejemplo si el mes se utiliza por su nombre no dará el problema que puede darse por intercambiar mes y día (cuando el día es igual o inferior a doce: 5/julio/2023).

Puestos a convertir datos, lo adecuado es hacer la conversión mas adecuada (se conoce el origen del dato) y así evitar que Access interprete libremente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas