Saltar al contenido

Calcular edad con Macro.


Recommended Posts

publicado

Buenas tardes colegas. Espero se encuentren bien de salud todos.

Necesito un aporte de ustedes.

En el formulario FrmEmpleado almaceno una serie de datos, entre ellos la Edad de cada uno de los empleados, pero yo necesito que la misma se genere de manera automática a partir del numero de identidad que es el campo que le precede.

Me explico;

El campo CI (TxtIdentidad) recoje el número de Identidad permanente de cada Cubano y esta formado por: los seis primero dígitos la fecha de nacimiento, los 5 restantes son tomo, folio y sexo, A nuestros efectos e interés los 6 primeros.

Por ejemplo, mi numero permanente es     66020108609  donde 66 en el año de nacimiento (1966), 02 el mes (Febrero) y 01 el día

y yo necesito que cuando yo digite este numero en el TextBox  TxtIdentidad, en el TextBox TxtEdad me imprima la edad, o sea, 56.

Yo traté de llegar a ella con un par de códigos, pero no supe colocarlo en el lugar ni el evento adecuado, estos códigos están en el Modulo5.

Por favor, si fueran tan amables.

Mis respetos y gracias de antemano.

Pino

Proyecto EdgarForo.xlsm

publicado

Como dice el amigo Abraham, en caso de personas de más de 100 años vas a tener problemas, te dejo una función:

Function CalcularEdad(Identidad As String) As Integer
Dim fecha As String
If Left(Identidad, 2) > Right(CStr(Year(Date)), 2) Then
   fecha = "19" & Left(Identidad, 6)
Else
   fecha = Right(CStr(Year(Date)), 2) & Left(Identidad, 6)
End If
año = CInt(Left(fecha, 4))
mes = CInt(Mid(fecha, 5, 2))
día = CInt(Mid(fecha, 7, 2))
CalcularEdad = Year(Date) - año
If mes = (Month(Date) And día > Day(Date)) Or _
   mes > Month(Date) Then
   CalcularEdad = CalcularEdad - 1
End If
End Function

y la llamas de esta manera:

TxtEdad = CalcularEdad(TxtIdentidad)

 

publicado

Buenas Tardes, colegas, espero se encuentren excelente de salud.

Buenas tardes, amigo Abraham, buenas tardes, profesor Antoni. Esa pregunta que me haces es la primera vez que la escucho y verdaderamente no había pensado en eso y es al mismo tiempo curioso e interesante. Voy a buscar la manera de averiguar como se clasificaran o diseñarán en un futuro los números de Identidad, unque ya un poco más en jarana o broma (y también serio), el número de personas que lleguen hasta los 100 años en Cuba debe ser BASTANTE reducido, con los niveles de strees, la mala alimentación, la falta de medicamento, los "apagones", las escaseces (...) y el clima. Por otro lado, para el caso en cuestión, no creo que importe mucho, porque con 100 o más ya no debes estar trabajando, aunque si es bueno saber qué alternativa tomar, porque si estuviéramos hablando de una base de datos en un Hogar de Ancianos, una Casa de Abuelos, una Sala de Geriatría o algo parecido, sí afectaría.

Ya de manera más seria, agradezco a los dos por su interés en acudir a mi duda y darme una respuesta.

Reviso el código y les comento, pero viniendo de ustedes, en este caso del Profesor Antoni, eso "es pan comido".

Gracias a todos. Salúdenme (si tienen la oportunidad) a mi amigo Haplox, a Leopoldo Blancas, a Raigosa,  a JSD y demás miembros.

Los admiro y respeto.

Saludos

Pino

publicado
En 26/8/2022 at 3:35 , Antoni dijo:
mes = CInt(Mid(fecha, 5, 2))

Buenos días, colegas. Espero se encuentren bien de salud.

Buenos días, Profesor Antoni, son mis deseos que usted y su familia gocen de excelente salud.

Cuando probé su código, me dio el Erro 13 en la línea arriba señalada.  Yo, con mis pocos conocimientos, veo que el código está perfecto y esa línea no tiene nada, repito a mi parecer que soy apenas un aprendiz. Reinicié el Ordenador y después no me volvió a dar ese error, pero no me hace el cálculo. Una pregunta, profesor, el:

TxtEdad = CalcularEdad(TxtIdentidad) en qué objeto y evento lo coloco. Porque puede ser que no lo esté haciendo en el ligar correcto.

Gracias de antemano.

Mis respetos y que tengan un feliz fin de semana.

Saludos

Pino

 

publicado

Buenas tardes colegas. Espero se encuentren bien.

Buenos días profesor Antoni, efectivamente, no estaba considerando el condicional if-end if, creo que no lo hubiera logrado sin su ayuda. Una vez más gracias. 

Le escribo desde el móvil porque acá estamos en apagón.

Mi respeto.

Un abrazo y tema cerrado.

Lo aprecia.

Pino.

publicado

Buenas noches @Pinoji

Me atrevo a proponer otra solución, aparte de la del gran maestro @Antoni. Yo lo haría en el evento exit del cuadro de texto....

Private Sub TxtIdentidad_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    On Error Resume Next
    TxtEdad.Text = Evaluate("=DateDif(" & CLng(DateSerial(Left(TxtIdentidad.Text, 2), Mid(TxtIdentidad.Text, 3, 2), Mid(TxtIdentidad.Text, 5, 2))) & "," & CLng(Date) & ",""y"")")
    If err.Number <> 0 Then
        TxtEdad.Text = "N/A"
    End If
End Sub

En resumen, mi planteamiento no es hacer una UDF (función definida por el usuario) sino que, siendo un vago completo, prefiero usar herramientas que ya provee Excel, como la amada función SIFECHA (DateDif) solo para evitar la fatiga ?

Si hay algún error con los 6 primeros dígitos, pone "N/A" como respuesta a la edad. El tema de resolver el año correcto de 4 dígitos (puesto que únicamente se digitan 2) se lo dejo al sistema operativo,  yo no me meto en discusiones (otra vez por vago), que eso lo determine el Sistema Operativo según su configuración regional.

 

image.thumb.png.20a417978b77fecdcf2be42f4684f378.png

 

 

publicado

Buenas noches Diego, no había tenido la posibilidad de responder.

Excelente también su propuesta, lo probé y funcionó perfecto. Es bueno tener variantes o como decimos los cubanos un Plan B por si acaso.

Gracias mil

Un abrazo

Pino

 

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.