Lo que pides es posible realizarlos pero si trabajas por medio de formularios, si trabajas directamente en la tabla tendrás que controlarlo "manualmente".
Te explico cómo se haría, haciendo un par de suposiciones sobre tu BD:
La tabla trabajadores tiene un campo que identifique de manera inequívoca a cada uno (bien sea un campo autonumérico, numérico o por ejemplo el DNI, que llamaré IDTrabajador), y este campo se relaciona con otro campo de la tabla permisos.
En la tabla permisos, supondré que hay estos campos: trabajador (relacionado con Trabajadores), tipoPermiso, Fecha.
Tienes un formulario sobre la tabla permisos, donde eliges el trabajador, el tipo de permiso, las fechas.
En el cuadro de texto (o cuadro combinado) en el que elijes el tipo de permiso, sacas sus propiedades, y en la pestaña Eventos, en el evento Antes de Actualizar, le das al botón de los 3 puntos que aparece a la derecha, y elijes generador de código. En la ventana que se abre, escribes esto:
Dim rst as Recordset
Dim miSQL as String
Dim numPermisos as Integer
miSQL="SELECT * FROM Permisos WHERE IDTrabajador='" & Me.IDTrabajador & "' tipoPermiso='Asuntos Propios' AND Year(Fecha)=" & Year(Date)
Set rst=CurrentDb.OpenRecordset(miSQL,dbOpenDynaset)
If rst.RecordCount=0 then
numPermisos=0
Else
rst.MoveLast
numPermisos = rst.RecordCount
End if
rst.Cose
If numPermisos>3 Then
MsgBox "Ya no le quedan días de asuntos propios disponibles",vbOkOnly
Cancel =True
Es decir, antes de actualizar el valor del campo, crea una consulta en la que se selecciona el trabajador, y los días de Asuntos propios que solicitó en el año en curso. Si no solicito ninguno, la variable numPermisos es 0, si no es el numero que lleva solicitado.
A continuación se compara numPermisos con 3, de tal forma que si es mayor, nos sale un mensaje de aviso y se cancela la acción.
Ya me dirás si te sirve.