Está en la página 1de 4

CALCULAR EDAD1

Una pregunta que he contestado varias veces y que suele


ser algo recurrente es: ¿cómo puedo calcular, a fecha de
hoy, la edad de una persona si tengo un campo con la fecha
de nacimiento?

Existe por Internet un procedimiento que calcula la edad


por aproximación y que no suele fallar demasiado, pero
tiene el “pero” de que a veces sí falla.

A través de este ejemplo os voy a explicar cómo conseguir que Access nos calcule la edad en
dos situaciones:

1.- A medida que vamos introduciendo datos en un formulario, al rellenar el campo que nos
informa de la fecha de nacimiento.

2.- Pulsando un botón, de manera que Access nos actualiza la información de TODOS los
registros de la tabla.

Evidentemente la referencia para poder calcular esa edad será la fecha actual, que nos vendrá
dada por la fecha del sistema.

Creo que el objetivo del ejemplo es claro, por lo que no me “enrollaré” más. Vámonos pues a
por la “chicha”...

PREPARANDO MI TABLA
Para desarrollar el ejemplo utilizaré una tabla que llamaré TDatos, y que tendrá la siguiente
estructura (simplificada para centrarnos en el tema de la edad):

Como curiosidad os diré que el campo [Edad] lo he definido como “Entero” (y no “Entero
largo”) porque la “capacidad” de un Entero es más que suficiente para contener los hipotéticos
valores de edad de una persona. Así optimizamos recursos.

PREPARANDO MI FORMULARIO
Vamos a crearnos un formulario basado en la tabla TDatos, y vamos a llamarlo FDatos. El
proceso no tiene mayor secreto.

Voy a crear también un formulario en blanco, al que llamaré FMenu, para tener un lugar donde
introducir un botón de comando para actualizar las edades “en masa”. Evidentemente, en
vuestra aplicación, ese botón podría ir en el formulario que estimarais más oportuno.

1 La BD de ejemplo os la podéis bajar aquí

1
Visítame en http://neckkito.siliconproject.com.ar
CREANDO MI “MÓDULO CALCULADOR”
Vamos a abrir nuestro editor de VB. Para ello simplemente,
con la BD abierta, debemos pulsar la combinación de teclas
ALT+F11.

Cuando se nos abra el VBE nos vamos a Menú → Insertar →


Módulo. Guardamos ese módulo con el nombre de
mdlCalculaEdad.

Veremos que nos aparece una línea en la parte superior de


la ventana de código, que pone “Option Compare
Database”. Puede ocurrir que nos aparezca una segunda
línea (según cómo tengamos configurada la declaración de
variables), que ponga “Option Explicit”.

Independientemente de que nos salgan una o dos líneas, debajo de ella/s escribimos la
siguiente función (el código está totalmente comentado):


Public Function calculaEdad(fNacim As Date) As Integer
'Neckkito - 22/01/13
'Declaramos las variables
Dim vAnyo As Integer, vMes As Integer, vDia As Integer
Dim vAnyoNow As Integer, vMesNow As Integer, vDiaNow As Integer
'Descomponemos las fecha de nacimiento
vAnyo = Year(fNacim)
vMes = Month(fNacim)
vDia = Day(fNacim)
'Descomponemos la fecha actual
vAnyoNow = Year(Date)
vMesNow = Month(Date)
vDiaNow = Day(Date)
'Suponemos inicialmente que la edad es la diferencia en años. Eso implica
'que damos por supuesto que el mes actual es superior al mes de nacimiento
calculaEdad = vAnyoNow - vAnyo
'Analizamos el mes por si se contradice nuestra suposición inicial. Caben
'dos posibilidades. Que sea menor o que sea igual
Select Case vMesNow
Case Is < vMes 'Si es menor...
calculaEdad = calculaEdad - 1 'Restamos una unidad (aún no ha hecho el "cumple")
Case Is = vMes 'Si es el mismo mes...
'Debemos analizar el día. Si el día actual es menor es que aún no ha
'cumplido años...
If vDiaNow < vDia Then
calculaEdad = calculaEdad - 1 '... y debemos restarle una unidad
End If
End Select
End Function

SISTEMÁTICA PARA CALCULAR LA EDAD


AUTOMÁTICAMENTE EN LA INTRODUCCIÓN DE
REGISTROS
Vamos a preparar un código que nos calculará el valor que necesitamos. Ese código actuará
tan pronto como introduzcamos la fecha de nacimiento, haciendo una llamada a nuestra
función calculaEdad pasándole el argumento correspondiente.

Aprovecharemos para poner algunas líneas de control para comprobar si el valor introducido en

2
Visítame en http://neckkito.siliconproject.com.ar
[FNac] es correcto.

Así pues, con FDatos en vista diseño, sacamos las


propiedades del campo [FNac] y le generaremos, en el
evento “Después de actualizar”, el siguiente código2:


Private Sub FNac_AfterUpdate()
'Comprobamos que exista una fecha de nacimiento. Si no salimos
If IsNull(Me.FNac.Value) Then Exit Sub
'Comprobamos que la fecha de nacimiento NO sea superior a la fecha
actual
If Me.FNac.Value > Date Then
MsgBox "Fecha de nacimiento errónea", vbCritical, "ERROR"
Exit Sub
End If
'Asignamos el valor que devuelve nuestra función calculaEdad
'a nuestro campo [Edad]
Me.Edad.Value = calculaEdad(Me.FNac.Value)
'Situamos el foco en el campo [Obs]
Me.Obs.SetFocus
End Sub

SISTEMÁTICA PARA ACTUALIZAR LA EDAD EN TODOS LOS


REGISTROS
En el formulario FMenu (insisto, en cualquier formulario que queramos) vamos a introducir un
botón de comando. A ese botón lo vamos a llamar cmdActualizaEdad3.

Si somos usuarios de Access 2003 quizá debamos registrar una referencia si no la tenemos ya.
La referencia que debemos registrar es “Microsoft DAO 3.6 Object Library”4.

En el evento “Al hacer click” de cmdActualizaEdad generaremos el siguiente código:


Private Sub cmdActualizaEdad_Click()
'Requiere regristrar referencia "Microsoft DAO 3.6 Object Library" o
'módulo equivalente
'Declaramos las variables
Dim rst As DAO.Recordset
Dim vFN As Variant
Dim vEdad As Integer
'Creamos el recordset sobre la tabla TDatos
Set rst = CurrentDb.OpenRecordset("TDatos", dbOpenTable)
'Si no hubiera registros avisamos y saltamos a salida
If rst.RecordCount = 0 Then
MsgBox "No hay registros para actualizar", vbExclamation, "SIN REGISTROS"
GoTo Salida
End If
'Nos situamos en el primer registro
With rst
.MoveFirst
'Empezamos el recorrido de registros
Do Until .EOF
'Asignamos el valor del campo [FNac] a la variable vFN
vFN = .Fields("FNac").Value

2 Para generar código debemos sacar las propiedades del control → Pestaña Eventos, y nos situamos en la parte “blanca” a la
derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos click sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.
3 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras →
Nombre. Ahí escribimos el nombre que queramos.
4 Para registrar una referencia debemos irnos, en el editor de VB, a Menú → Herramientas → Referencias... Se nos abrirá una
ventana mostrándonos todas las referencias disponibles. Buscamos la que nos interese, marcamos su check y aceptamos.

3
Visítame en http://neckkito.siliconproject.com.ar
'Si no hubiera fecha saltamos a siguiente
If IsNull(vFN) Then GoTo Siguiente
'Si hay fecha llamamos a la función calculaEdad para saber dicha edad
vEdad = calculaEdad(CDate(vFN))
'Escribimos la edad en el campo correspondiente
.Edit
.Fields("Edad").Value = vEdad
.Update
Siguiente:
'Nos movemos al siguiente registro y repetimos el proceso
.MoveNext
Loop
End With
'Lanzamos un mensaje de confirmación
MsgBox "Actualización realizada correctamente", vbInformation, "OK"
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub

Si me permitís haré un pequeño comentario al código, como curiosidad por si no lo hacéis así y
os salen “mensajes raros”.

Nuestra función calculaEdad tiene, como argumento, fNacim, que hemos definido como un
valor de tipo Date.

En nuestro código vemos que la fecha de nacimiento se recoge en una variable que hemos
llamado vFN, y que hemos definido como Variant. La hemos definido como Variant para que
pudiera coger sin problemas valores NULL. De esta manera podíamos examinar vFN y, en caso
de ser NULL, tomábamos la decisión de saltar al registro siguiente ( If IsNull(vFN) Then GoTo
Siguiente).

En este caso, si al llamar a la función calculaEdad hubiéramos escrito:

vEdad = calculaEdad(vFN)

¿qué hubera pasado? Pues que nuestra función esperaba recibir un valor tipo Date, y le
pasamos un valor tipo Variant. Como nuestra función sólo admite valores tipo Date nos avisa
de esta manera (quizá un poco extraña si no estamos acostumbrados):

Es por ello por lo que, para poderle pasar el valor de la variable vFN al argumento antes
debemos convertirlo en un tipo compatible. Y es por ello por lo que utilizamos la función de
conversión CDate(), y de ahí que se haya escrito: vEdad = calculaEdad(CDate(vFN))

PARA FINALIZAR EL EJEMPLO


Y eso es todo. Espero que hayamos podido entender la sistemática del proceso para poderlo
utilizar sin problemas a vuestras propias aplicaciones.

Un saludo, y... ¡suerte!

4
Visítame en http://neckkito.siliconproject.com.ar