He usado función para calcular la antigüedad de un trabajador en años y meses. Pero no consigo añadir los días

A la función usada y que funciona estupendamente, no he conseguido añadir las instrucciones necesarias para que además de los años y meses, me calcule también los días.

1 Respuesta

Respuesta
1

Mª Teresa, puedes utilizar esta función:

'--------------------------------------------------------------------------------------------
'Función para calcular la edad en años y meses, o en días si es menor de un mes
'Por Sveinbjorn
'--------------------------------------------------------------------------------------------
Public Function fncEdadDetalle(FechaNac As Date) As String
Dim vAño As Double
Dim vMes As Double
Dim vDia As Double
If IsNull(FechaNac) Then
    fncEdadDetalle = ""
    Exit Function
End If
If FechaNac = Date Then
    fncEdadDetalle = "0 días"
    Exit Function
End If
'Compruebas el mes
If Month(FechaNac) > Month(Date) Then
    vAño = DateDiff("yyyy", FechaNac, Date) - 1
Else
    vAño = DateDiff("yyyy", FechaNac, Date)
End If
'Compruebas el día
If Day(FechaNac) > Day(Date) Then
    vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date) - 1
    If vMes < 0 Then
        vMes = 12 + vMes
        vAño = vAño - 1
    End If
Else
    vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date)
End If
'Si es menor de un mes, calculas la edad en días
If vAño = 0 And vMes = 0 Then vDia = DateDiff("d", FechaNac, Date)
'Construyes la cadena de la edad
If vAño = 1 Then
    fncEdadDetalle = vAño & " año"
ElseIf vAño > 1 Then
    fncEdadDetalle = vAño & " años"
End If
If vMes = 1 Then
    fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " mes"
ElseIf vMes > 1 Then
    fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " meses"
End If
If vDia = 1 Then
    fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " día"
ElseIf vDia > 1 Then
    fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " días"
End If
End Function

Imagino que ya sabrás cómo va esto: copias la función en un módulo de tu BD, y luego la usas como si fuera una de las que trae el propio Access, ya sea en el código o en una consulta, como origen de un cuadro de texto..., siempre pasándole como parámetro un dato de tipo fecha (la fecha de nacimiento)

Saludos!


Una nueva web y foro de Access, visítanos: http://nksvaccessolutions.com/ 

Si, he ubicado la función en un módulo y he llamado a éste en el evento de un campo fecha. En mi caso, [fecha de baja laboral], porque necesito saber que si por ejemplo se comienza la baja el 25/02/2016;  a fecha de hoy, el período de baja es de 2 meses y 6 días.

Una vez aplicada la función, el resultado que me da es : 2 meses

Perdona, que te pegué una función que no era. La anterior sólo calcula los días si la edad es menor de un mes...

Ésta es la correcta:

'--------------------------------------------------------------------------------------------
' Función para calcular la diferencia entre fechas en años, meses y días
' Por Sveinbjorn
'--------------------------------------------------------------------------------------------
Public Function fncDiferenciaFechas(ByVal laFechaIni As Date) As String
Dim vAño As Double
Dim vMes As Double
Dim vDia As Double
Dim laFechaFin As Date
Dim temp As Date
'Si no se metió la fecha, salimos sin más
If IsNull(laFechaIni) Then
    fncDiferenciaFechas = ""
    Exit Function
End If
laFechaFin=Date
'Comprobamos que la fecha inicial sea más antigua que la final
If laFechaIni > laFechaFin Then
    temp = laFechaIni
    laFechaIni = laFechaFin
    laFechaFin = temp
ElseIf laFechaIni = laFechaFin Then 'Si las dos fechas son la misma
    fncDiferenciaFechas = "0 días"
    Exit Function
End If
'Calculas la diferencia en años
If Month(laFechaIni) > Month(laFechaFin) Then
    vAño = DateDiff("yyyy", laFechaIni, laFechaFin) - 1
Else
    vAño = DateDiff("yyyy", laFechaIni, laFechaFin)
End If
'Calculas la diferencia en meses
If Day(laFechaIni) > Day(laFechaFin) Then
    vMes = DateDiff("m", DateAdd("yyyy", vAño, laFechaIni), laFechaFin) - 1
    If vMes < 0 Then
        vMes = 12 + vMes
        vAño = vAño - 1
    End If
Else
    vMes = DateDiff("m", DateAdd("yyyy", vAño, laFechaIni), laFechaFin)
End If
'Calculas la diferencia en días
vDia = DateDiff("d", DateAdd("m", vAño * 12 + vMes, laFechaIni), laFechaFin) ' Mod 7
'Construyes la expresión
If vAño = 1 Then
    fncDiferenciaFechas = vAño & " año"
ElseIf vAño > 1 Then
    fncDiferenciaFechas = vAño & " años"
End If
If vMes = 1 Then
    fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vMes & " mes"
ElseIf vMes > 1 Then
    fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vMes & " meses"
End If
If vDia = 1 Then
    fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vDia & " día"
ElseIf vDia > 1 Then
    fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vDia & " días"
End If
End Function

¡Gracias! Muchísimas gracias por la celeridad en la respuesta y su eficacia

Ha funcionado GENIAL!!!

Hola! Tal y como comenté, la función es perfecta y su resultado lo he dejado en un campo texto.

De forma que puedo tener: 1 año, 6 meses y 5 días;  6 meses y 1 día;  4 meses y 24 días;  1 mes y 3 días,etc....

Por favor:

¿Cómo podría, mediante consulta, obtener todos los registros menores o iguales a  6 meses?

Muchas gracias por vuestra amabilidad

Con esa función no puede hacerlo, porque devuelve un valor de tipo texto.

Necesitas una nueva función que te haga el cálculo de la edad en meses, y usarla en la consulta con el criterio que indicas (este nuevo campo lo puedes ocultar para que no se muestre en el resultado de la consulta).

Prueba esta función, a ver si te sirve:

'--------------------------------------------------------------------------------------------
' Función para calcular la edad en meses
' Por Sveinbjorn
'--------------------------------------------------------------------------------------------
Public Function fncEdadMeses(FechaNac As Date) As Integer
Dim vMes As Integer
If Day(FechaNac) > Day(Date) Then
    vMes = DateDiff("m", FechaNac, Date) - 1
Else
    vMes = DateDiff("m", FechaNac, Date)
End If
fncEdadMeses = vMes
End Function

Como te decía, la añades a tu consulta en una nueva columna (oculta o no, como veas) y en criterios le pones el <=6

Saludos!


Una nueva web y foro de Access, pásate: http://nksvaccessolutions.com/ 

¡Gracias! ¡Perfecto!

He utilizado las dos funciones. La primera me aporta una información necesaria en un campo de texto

La segunda, la utilizo para realizar las consultas oportunas

Gracias de nuevo por vuestra respuesta tan eficaz y rápida

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas