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.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    3    1

  • Crear macros Excel

  • Mensajes

    • Saludos amigos espero estén bien  En la actualidad utilizo la siguiente macro para generar un código alfanumérico continuo que al guardar los datos se copia en la Celdas “B5” de las Hojas 58 (MATRIZ1) y Hojas59 (MATRIZ2) Private Sub CommandButton3_Click()     If Hoja58.Range("B5").Value < 9999 Then Hoja58.Range("B5").Value Hoja58.Range("B6").Value + 1     Else        Hoja58.Range("B5").Value = 1     End If If Hoja59.Range("B5").Value < 9999 Then Hoja59.Range("B5").Value = Hoja59.Range("B6").Value + 1 Else        Hoja59.Range("B5").Value = 1     End If End Sub El código se genera normalmente sin embargo no se copia inmediatamente en las Celdas “B5” sino que aparece en las Celdas “B6” mientras que las Celdas “B5” siempre permanecen en blanco, actualmente el código consta de tres letras y cuatro dígitos (RCI-0000) pero me interesa poderle concatenar el mes y año en formato mm-yy para que el código finalmente quede expresado de la siguiente forma RCI-0000-00-00 Mucho les sabre agradecer la ayuda que me puedan dar RCI PRUEBA..xlsm
    • Saludos amigos espero estén bien  En la actualidad cuando introduzco texto en los TextBox 5, 6 y 7 y dicho texto es mas largo que el ancho de los Texbox el texto se copia en una misma línea lo que dificulta verificar la redacción, así como visualizar cualquier error por lo cual necesito me ayuden con una macro que justifique el texto dentro de los Textbox, he probado usar la función Multiline sin obtener el resultado esperado. Mucho les sabre agradecer la ayuda que me puedan dar RCI PRUEBA..xlsm
    • Saludos amigos espero estén bien  En la actualidad utilizo los datos provenientes de los TextBox 5, 6 y 7 se guardan en las Columnas H, I y O de las Hojas 58 (MATRIZ1) y Hojas59 (MATRIZ2) sin embargo cuando el texto es abundante no se visualiza completamente en las celdas correspondientes de allí que necesito que cada fila se ajuste al tamaño de la celda que contenga mayor cantidad de texto para lo cual he probado con la siguiente macro: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.EntireRow.AutoFit End Sub Sin embargo, dicha macro coloca todas las filas del tamaño del texto que contengan y lo que en realidad necesito es que dicha macro solo se aplique desde la Fila 5 en adelante. Mucho les sabre agradecer la ayuda que me puedan dar RCI PRUEBA..xlsm
    • Saludos amigos espero estén bien  En la actualidad utilizo la siguiente macro para que la fecha aparezca en el Textbox2: Private Sub UserForm_activate() Me.TextBox2.Value = VBA.Date End Sub Sin embargo, una vez guardo los datos la fecha cambia de formato y se guarda en formato mm/dd/yyyy en vez de dd/mm/yyyy y este cambio de fecha me distorsiona los resultados de las fórmulas en las Columnas J en las Hojas 58 (MATRIZ1) y Hojas59 (MATRIZ2) Mucho les sabre agradecer la ayuda que me puedan dar RCI PRUEBA..xlsm
    • ¡Hola! Después de un buen tiempo ausente...  @Gabriela hg ya que veo que tienes Excel 365, te dejo mi solución para piezas y gramos.   Extraer piezas - gramos 365_GP.xlsx
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.