Saltar al contenido

Operaciones con Fechas


Recommended Posts

publicado

Saludos Amigos 

Tengo esta macro que me ayuda a calcular  la antigüedad  medida desde la fecha de ingreso hasta la fecha accidente sin embargo solo me da como resultado el año como un numero entero  y no me toma en cuenta la diferencia de los meses restantes entre ambas fechas la cual requiero expresar como decimales de forma anualizada :

Ejemplo:  15/08/2010 - 17/01/2004 = 13 Años (Resultado Actual)

                      15/08/2010 - 17/01/2004 =   05 meses de diferencia entre la fecha de ingreso  y la fecha del accidente 

                                                                                         05 meses / 12 Meses =  0,42 Años (Diferencia en Meses  Anualizada)

                       15/08/2010 - 17/01/2004 = 13, 42 años (Resultado Esperado)

Meses          Años

1/12              0,08

2/12              0,17

3/12              0,25

4/12              0,33

5/12              0,42

6/12              0,50

7/12              0,58

8/12              0,67

9/12              0,75

10/12            0,83

11/12            0,92

Private Sub TextBox8_Change()

' Calculo de la Antiguedad
    ' Definir una variable para la fecha del Accidente
    Dim fechaAccidente As Date
        
    ' Asignar la fecha del Accidente
    fechaAccidente = TextBox8
        
    ' Obtener la fecha de Ingreso
    fechaIngreso = TextBox7
        
    ' Calcular la Antiguedad
    Dim Antiguedad As Integer
    Antiguedad = Year(fechaAccidente) - Year(fechaIngreso)
    
    ' Ajustar la Antiguedad si aún no ha tenido su cumpleaños este año
    If fechaIngreso > DateSerial(Year(fechaAccidente), Month(fechaAccidente), Day(fechaAccidente)) Then
        Antiguedad = Antiguedad - 1
    End If
    
    ' Mostrar el resultado en la ventana de mensajes
    TextBox9 = Antiguedad

End Sub

De igual modo tengo esta otra macro  que me ayuda a calcular  la Edad  medida desde la fecha de nacimiento hasta la fecha actual:

Private Sub TextBox6_Change()

' Calculo de la Edad
    ' Definir una variable para la fecha de nacimiento
    Dim fechaNacimiento As Date
    
    ' Asignar la fecha de nacimiento
   fechaNacimiento = TextBox6
    
    ' Obtener la fecha actual
    Dim fechaActual As Date
    fechaActual = Date
    
    ' Calcular la Edad
    Dim edad As Integer
    edad = Year(fechaActual) - Year(fechaNacimiento)
        
    ' Ajustar la edad si aún no ha tenido su cumpleaños este año
    If fechaNacimiento > DateSerial(Year(fechaActual), Month(fechaActual), Day(fechaNacimiento)) Then
        edad = edad - 1
    End If
    
    ' Mostrar el resultado en la ventana de mensajes
    TextBox3 = edad
End Sub

Sin embargo no expresa el resultado que deseo ya que  el calculo correcto debe ser hecho desde la fecha de nacimiento hasta la fecha accidente pero al momento de replicar  el procedimiento en los siguientes términos me arroja un error:

Private Sub TextBox6_Change()

    ' Definir una variable para la fecha de nacimiento
    Dim fechaAccidente As Date
    
    ' Asignar la fecha de nacimiento
    fechaAccidente = TextBox8
    
    ' Asignar la fecha del Accidente
    fechaNacimiento = TextBox6
    
    ' Calcular la Edad
    Dim edad As Integer
    edad = Year(fechaAccidente) - Year(fechaNacimiento)
    
    ' Ajustar la edad si aún no ha tenido su cumpleaños este año
    If fechaNacimiento > DateSerial(Year(fechaAccidente), Month(fechaAccidente), Day(fechaAccidente)) Then
        edad = edad - 1
    End If
    
    ' Mostrar el resultado en la ventana de mensajes
    TextBox3 = edad
End Sub

Usuario: Prueba

Clave: Prueba12345

 Mucho les sabre agradecer la ayuda que me puedan brindar

PRUEBA.xlsm

publicado

Prueba esta macro:

Sub Diferencia()
Dim Fecha As Date
Fecha = CDate("15/08/2010") '<---------- Tu fecha de ejemplo
MsgBox "Años: " & Round(DateDiff("m", Fecha, Date) / 12, 2)
End Sub

Nota: Los textbox  tiene formato texto, debes convertirlos a fecha antes de operar con ellos. (Función CDate)

publicado

Saludos @Antoni

Disculpe lo novato creo que omití información o no me explique suficientemente bien lo que necesito es que dentro de la macro que ya tengo: 

Private Sub TextBox8_Change()

' Calculo de la Antiguedad
    ' Definir una variable para la fecha del Accidente
    Dim fechaAccidente As Date
        
    ' Asignar la fecha del Accidente
    fechaAccidente = TextBox8
        
    ' Obtener la fecha de Ingreso
    fechaIngreso = TextBox7
        
    ' Calcular la Antiguedad
    Dim Antiguedad As Integer
    Antiguedad = Year(fechaAccidente) - Year(fechaIngreso)
    
    ' Ajustar la Antiguedad si aún no ha tenido su cumpleaños este año
    If fechaIngreso > DateSerial(Year(fechaAccidente), Month(fechaAccidente), Day(fechaAccidente)) Then
        Antiguedad = Antiguedad - 1
    End If
    
    ' Mostrar el resultado en la ventana de mensajes
    TextBox9 = Antiguedad

End Sub

Se le pueda añadir o  integrar esa u otra línea de código que  efectué  el calculo  y me permita registrar los resultados  que combinen el número entero más los decimales anualizados  correspondientes a la Antigüedad de forma directa  en el TextBox9 

Imagen44.jpg.f110e46328588776b9287feab1d11095.jpg

publicado
Sub TextBox8_Change()
If IsDate(TextBox8) and IsDate(TextBox7) Then
   TextBox9 = Round(DateDiff("m", TextBox7, TextBox8) / 12, 2)
End If                                            
End Sub

 

publicado

Corrijo:

Sub TextBox8_Change()
If IsDate(TextBox8) and IsDate(TextBox7) Then
   TextBox9 = Round(DateDiff("m", CDate(TextBox7), CDate(TextBox8)) / 12, 2)
End If                                            
End Sub

 

publicado
hace 20 horas, Antoni dijo:

Corrijo:

Sub TextBox8_Change()
If IsDate(TextBox8) and IsDate(TextBox7) Then
   TextBox9 = Round(DateDiff("m", CDate(TextBox7), CDate(TextBox8)) / 12, 2)
End If                                            
End Sub

 

Saludos @Antoni espero este bien funciona excelente la solución que me envió , ¿tiene  alguna solución igual de buena para la segunda parte de mi pregunta respecto  al calculo de la edad hecho desde la Fecha de Nacimiento (TextBox6) hasta la Fecha del Accidente (TextBox8) que adicionalmente ajuste la edad si aún no ha tenido su cumpleaños ?

Agradecido de antemano.

publicado
En 18/1/2024 at 12:12 , Antoni dijo:

Corrijo:

Sub TextBox8_Change()
If IsDate(TextBox8) and IsDate(TextBox7) Then
   TextBox9 = Round(DateDiff("m", CDate(TextBox7), CDate(TextBox8)) / 12, 2)
End If                                            
End Sub

 

Saludos Sr. @Antoni  espero este bien

He seguido intentando obtener la Edad en base a la macro que usted me envió sin embargo al replicar la macro y eliminar los decimales

Private Sub TextBox6_Change()

'Calculo de la Edad

If IsDate(TextBox8) And IsDate(TextBox6) Then

   TextBox3 = Round(DateDiff("m", CDate(TextBox6), CDate(TextBox8)) / 12)

End If

End Sub

No logro hacer que me compense la edad si no ha llegado a su cumpleaños, es decir:

24/01/2022 – 25/01/2024 = 2 años (Resultado Actual)

24/01/2023 – 25/01/2024 = 1 año (Resultado Esperado)

Adicionalmente para poder obtener resultado en el TextBox3 debo introducir los datos de forma inversa es decirTextBox8 y luego TextBox6 ya que en caso de introducirlos en el orden establecido TextBox6, TextBox7 y TextBox8 me indica que “Se ha producido un error 13 en tiempo de ejecución: no coinciden los tipos”

Agradecido de antemano en lo que me pueda ayudar.

 

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

    4    1

  • Crear macros Excel

  • Mensajes

    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
    • Podrías compartir tu solucion
    • Alguien me apoya a cerrar este tema,  ya lo solucioné Gracias
  • 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.