Hola a todos, espero que estéis bien y supongo que ya disfrutando de vacaciones (a mí aún me quedan unas semanas para comenzarlas).
En el post de hoy vamos a tratar de resolver una consulta que me enviaron la semana pasada sobre un tema que ya hace tiempo que tenía ganas de abordar. La pregunta era cómo se podía calcular la edad en un formulario de Excel.
Bien, existen varios post sobre el cálculo de la edad en esta web, y en todas ellas usamos la función SIFECHA() de excel, que normalmente la usamos en la hoja y en menor medida en VBA. En VBA esta función se denomina DATEDIF (y NO es lo mismo que otra función denominada DATEDIFF, que trabaja con valores absolutos).
Esta función, si utilizamos la grabadora de datos para obtener su traducción en VBA sería algo así:
AÑO = "=DATEDIF(RC[-12],TODAY(),""Y"")"
Es decir, nos ofrece la posibilidad de generar la fórmula en la hoja desde VBA. Pero lo cierto es que queremos trabajar con esta función sin acudir a la hoja en ningún momento, simplemente utilizar el formulario y los parámetros que hayamos incluido para calcular la edad de una persona.
Aunque esta función no existe en VBA como tal, podemos invocarla a través del método EVALUATE, aunque eso lo iremos viendo en el caso particular que nos ocupa.
Vamos a imaginar que tenemos un formulario con un cuadro de texto (textbox1) en el que debemos incluir la fecha de nacimiento, un botón de comando para ejecutar la macro y otro cuadro de texto (textbox2) en el que vamos a mostrar la edad completa:
Para calcular la edad vamos a incluir en modulo asociado al botón de comando el siguiente código:
Private Sub CommandButton1_Click()
'Definimos variables
Dim validarfecha As Boolean
Dim hoy As String
Dim f_nac As String
Dim año As Double, mes As Double, dia As Double
'Trabajamos con el formulario1
With UserForm1
'Cada vez que ejecutemos la macro vaciaremos el textbox1
.TextBox2 = Empty
'Si no existe fecha o el dato no es una fecha o está mal escrita, activamos mensaje y salimos el cálculo
validarfecha = IsDate(.TextBox1.Value)
If .TextBox1.Value = Empty Or validarfecha = False Or Len(.TextBox1.Value) > 10 Then
MsgBox ("DEBES INTRODUCIR UNA FECHA Y VERIFICAR QUE EL FORMATO SEA EL ADECUADO"), vbExclamation, "CONTROL"
Exit Sub
End If
'Si la fecha es mayor que la fecha actual, activamos mensaje y salimos el cálculo
If CDate(.TextBox1.Value) > Date Then
MsgBox ("LA FECHA NO PUEDE SER MAYOR QUE EL DÍA ACTUAL"), vbExclamation, "CONTROL"
Exit Sub
Exit Sub
End If
'Indicamos la fecha de hoy con formato mm/dd/aaaa y lo componemos en un string
hoy = (Month(Date) & "/" & Day(Date) & "/" & Year(Date))
'Indicamos la fecha de hoy con formato mm/dd/aaaa y lo componemos en un string
f_nac = (Month(.TextBox1.Value) & "/" & Day(.TextBox1.Value) & "/" & Year(.TextBox1.Value))
'Evaluamos la función Datedif para año, mes y día
año = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""Y"")")
mes = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""YM"")")
dia = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""MD"")")
'Pasamos el string con los años, meses y días de nuestra edad actual al textbox2
.TextBox2 = año & IIf(año = 1, " año", " años") & ", " & mes & IIf(mes = 1, " mes", " meses") & " y " & dia & IIf(dia = 1, " dia", " días")
End With
End Sub
Es importante tener en cuenta que la función reconoce la fecha con formato mm/dd/aaaa por lo que debemos especificar esto tanto para la variable que contiene la fecha actual «hoy» como para la que contiene la fecha de nacimiento «f_nac». Esto lo podemos solucionar componiendo un string con la fecha en el orden indicado.
En el cuadro de texto de la fecha de nacimiento el formato es el habitual: días, meses y años. Si necesitáis introducir los datos con otro formato, tendréis que modificar la macro en los dos string creados para que la función lea adecuadamente la información.
Luego debemos adaptar la función para trabajar con variables y evaluarla con el método Evaluate. Importante el uso de las comillas.
El resultado es el siguiente (calculado sábado 22 de Julio de 2017 a las 23:22 horas):
Y el resultado es el correcto (y también lo es que me voy haciendo más viejo). El formulario me muestra información completa de la edad que tengo en el momento de ejecutar el código.
He incluido en la macro varios controles: si no existe fecha, si la fecha está mal escrita o si es mayor que el día actual. Si sucede alguna de estas cosas, mostrará un mensaje y proceso finalizará.
Según configuraciones regionales las fechas tendrán formatos distintos, sin embargo, creo que adaptando la macro a meses, días y años funcionará en todos los lugares (siempre que escribamos la fecha de nacimiento con día, mes y año.
Pues esto ha sido todo, espero que os sea de utilidad a la hora de crear formularios o de poner en práctica la función Datedif en VBA.
Descarga el archivo de ejemplo pulsando en: CALCULAR LA EDAD EN UN FORMULARIO DE EXCEL
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Gracias. Me gustaria participar en el Foro aportando y que me aporten. EMIRO ERAZO
Hola Emiro,
Esto no es un foro, es una página web donde realizo publicaciones periódicamente. Agradezco tu intención de colaborar, y te invito a que sigas las publicaciones del blog.
Muchas gracias.
Hola Segu.
Buscando en tus post encontré este que me acerca más a lo que necesito: tengo un datepicker para seleccionar una fecha de nacimiento en un Form, requiero que en un textbox me calcule la edad, esto es casi lo que necesito pero la edad la ingreso desde el calendario. que necesito modificar para que me de resultado?
Gracias y un saludo
ya pude Segu, muchas gracias, solo quite los meses y dias… era muy facil, saludos
OK, perfecto Gabo.
Saludos.
Quería pedirte ayuda si es posible.
Tengo un formulario con un TextBox en el que cargó la fecha de nacimiento llamando con un CommandButton un calendario, hasta ahí todo bien, lo que deseo es que con el mismo CommandButton, una vez me ponga la fecha en el primer TextBox, me ponga también automáticamente en un segundo TextBox los años que tiene.
Gracias de antemano
Hola Marcos:
Tendría que ver el archivo que indicas con el ejemplo. Puedes enviarlo a info@excelsignum.com
De todas formas en el ejemplo que tienes, utilizando el evento TextBox1_Change() cada vez que cambie el textbox la edad se calcularía.
Saludos.
buenas, he utilizado tu código para sacar la edad con la fecha de nacimiento.
'Definimos variables
Dim validarfecha As Boolean
Dim hoy As String
Dim f_nac As String
Dim año As Double, mes As Double, dia As Double
'Trabajamos con el formulario1
With UserForm1
'Cada vez que ejecutemos la macro vaciaremos el textbox1
.TextBox2 = Empty
'Si no existe fecha o el dato no es una fecha o está mal escrita, activamos mensaje y salimos el cálculo
validarfecha = IsDate(.TextBox1.Value)
If .TextBox1.Value = Empty Or validarfecha = False Or Len(.TextBox1.Value) > 10 Then
MsgBox ("DEBES INTRODUCIR UNA FECHA Y VERIFICAR QUE EL FORMATO SEA EL ADECUADO"), vbExclamation, "CONTROL"
Exit Sub
End If
'Si la fecha es mayor que la fecha actual, activamos mensaje y salimos el cálculo
If CDate(.TextBox1.Value) > Date Then
MsgBox ("LA FECHA NO PUEDE SER MAYOR QUE EL DÍA ACTUAL"), vbExclamation, "CONTROL"
Exit Sub
Exit Sub
End If
'Indicamos la fecha de hoy con formato mm/dd/aaaa y lo componemos en un string
hoy = (Month(Date) & "/" & Day(Date) & "/" & Year(Date))
'Indicamos la fecha de hoy con formato mm/dd/aaaa y lo componemos en un string
f_nac = (Month(.TextBox1.Value) & "/" & Day(.TextBox1.Value) & "/" & Year(.TextBox1.Value))
'Evaluamos la función Datedif para año, mes y día
año = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""Y"")")
mes = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""YM"")")
dia = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""MD"")")
'pasamos el string con los años, meses y días de nuestra edad actual al textbox2
.TextBox2 = año & IIf(año = 1, " año", " años") & ", " & mes & IIf(mes = 1, " mes", " meses") & " y " & dia & IIf(dia = 1, " dia", " días")
End With
me da un error cuando llega a la línea
año = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""Y"")")
y me dice que no se ha definido sub o funcion (seleccionandome la palabra evaluate)
seguramente sea una tontería, pero soy muy novato en estos temas
muchas gracias
Tendría que ver el archivo para comprobar cuál es el motivo del error. Si descargas mi archivo y ejecutas la macro ¿te muestra un error?.
, buenas noches, siento hacerte perder el tiempo. El error creo que es sencillo. Ese código es para Excel y yo lo usé en Word, me di cuenta después. De todas formas, si pudieras mandarme algo similar para Word te lo agradecería infinitamente. Estoy creando unos archivos con VBA y estoy un poco perdido. Conozco cuatro códigos básicos y con eso me voy apañando. Muchas gracias por todo..
hola tu codigo me viene genial ademas sin error, pero tengo una duda si en vez de que me calcule hasta el dia de hoy quiero que me calcule la edad hasta el ultimo dia del año anterior… (31/12/2022) que tendria que cambiar..?
gracias.
Tendrías que crear un nuevo text box e incluir el dato en lugar de la variable Hoy. Saludos.