Vamos, por partes. Yo te explico como se calcula la antiguedad de un empleado, luego ya es cosa tuya, en función de ella asignarle las vacaciones.
Antes de nada, como sabrás no hay ni un sólo ordenador en el mundo que trabaje con fechas. Trabajan con números. Al día 31/12/1899 se le asignó el 0, al día 01/01/1900 el 1 y así hasta hoy que estamos en el día 43918. Los años y meses son fórmulas puramente matemáticas y las horas minutos y segundos son decimales de día. Por ejemplo, en esta hora que te estoy escribiendo(20:06) realmente es 43918,83703703. Por tanto tienes que convertir los dias en años meses y dias.
Voy a tratar de detallarlo. Si tengo el formulario Empleados en que figura la fecha en que entró a trabajar, FechaAlta
Cuando pulso el botón(es para la explicación)
Entre el día de hoy y el día en que se dio de alta, realmente has transcurrido lo que ves en DifDías. Si esa cantidad la divido por 365.2425 que son, redondeando, los días que tiene un año me queda lo que ves en AñosD, es decir 29 años "enteros" y un pico de año, que en este caso sería 0,3804 de año. Si esto lo multiplico por los días que tiene un año 365.2425 me da los días "entreros" que sobras después de los 29 años, que en este caso son 139. Estos días si los divido por 30,3 que es la media de días que tiene un mes, me da lo que ves en MesesD, es decir 4 meses y un pico de mes, que en este caso es 0.5874... de mes
Si este pico de mes lo multiplico por los 30,3 días que tiene un mes me sale lo que ves en DisD, es decir, 17 días y un pico de día día que se completaría a 18 cuando fueran las 23:59:59,9999999... de la noche. Pero paro aquí y me guardo el valor entero o sea 17. Con lo que abajo puedes ver su antiguedad.
En este caso, para la explicación el código del botón sería
Private Sub Comando9_Click()
DifDias = Date - FechaAlta
AñosD = DifDias / 365.2425
AñosF = Fix(DifDias / 365.2425)
RestoDias = DifDias - Int(AñosF * 365.2425)
MesesD = RestoDias / 30.3
MesesF = Int(RestoDias / 30.3)
RestoMeses = (RestoDias / 30.3) - MesesF
DiasD = (MesesD - MesesF) * 30.3
DiasF = Int(((RestoDias / 30.3) - Int(RestoDias / 30.3)) * 30.3)
Antiguedad = AñosF & " años, " & MesesF & " meses y " & DiasF & " días"
End Sub
Lógicamente poner esto en un registro sería un rollo. Por eso, en el formulario Copia de empleados te lo simplifico
Y el código, en este caso sería
Dim AñosF As Integer, MesesF As Integer, DiasF As Integer, RestoDias As Integer
AñosF = Fix((Date - FechaAlta) / 365.2425)
RestoDias = Date - FechaAlta - Int(AñosF * 365.2425)
MesesF = Int([RestoDias] / 30.3)
DiasF = Int(((RestoDias / 30.3) - Int(RestoDias / 30.3)) * 30.3)
Antiguedad = AñosF & " años, " & MesesF & " meses y " & DiasF & " días"
Por último, vamos a suponer que tu tabla, y por tanto el formulario no tienen datos. Personalmente pondría ese código en el evento Después de actualizar del cuadro de texto FechaAlta.
Si ya tuviera datos, lo que haría, sería poner en el evento Al activar el registro del formulario el código de arriba. Así tiene la ventaja de que, por ejemplo, hoy das de alta a un empleado, y hasta dentro de un par de años no vuelves a ver el registro de ese empleado. Si simplemente hubieras guardado la antiguedad el día que lo diste de alta, te encontrarías, dos años, después con que seguiría teniendo la misma, mientras que así, cada vez que visites a ese empleado te la actualiza.
Espero no haber sido muy pesado, pero es que las fechas son complicadas de trabajar con ellas.
Buenas tardes, mi amigo Julián, se sobró usted en esta respuesta, muy bien explicada, gracias por detallar cada paso que damos para hallar la diferencia entre dos fechas. En mi tierra dicen el que quiera mas que le compren pollo, lo echen en una licuadora y se lo den con pitillo. Gracias - Eder Monterroza