Calculo de fecha en excel

Necesisto el apoyo para lo siguiente:
Calculo de fecha en excel que no exceda 20 días dependiendo de la recepción de un documento, si la fecha cae en viernes, sábado, domingo y lunes nos de la fecha del jueves.
Si cae la fecha en miércoles nos de martes
Aquí lo importante es que no se debe de exceder de 20 días dependiendo la fecha de recepción de documento

1 respuesta

Respuesta
1
Existe una fórmula en excel que te permite obtener los días transcurridos entre dos fechas
DAYS360() basado en 30 días por mes
Si tienes en la celda A1 "15/10/2007" y en la celda A2 "29/06/2009" la fórmula seria:
=DAYS360(A1;A2;TRUE)
Esto retorna 614 días
Lo que preguntas de que si la fecha cae viernes, sábado, domingo o lunes nos de una fecha en jueves y si cae miércoles nos de una fecha en martes, te pido disculpas pero no lo entiendo bien tendrías que aclararlo mejor para poder ayudarte
Estimado desenex41
Agradezco tu apoyo y rápida respuesta, te comento mi problema por que tienes razón, creo que no fui muy claro.
Debo de pagar una factura en 20 días naturales máximo. No debo de exceder esta fecha.
Puedo recibir facturas cualquier día del mes pero no debo de exceder de 20 días para su pago.
Los días de pago que estoy contemplando son los martes y jueves unicamente, así es que dependiendo el día de recepción me debo de ajustar a los martes y jueves, pudiendo pagar antes de los 20 días ( en martes y jueves ) pero no después de los 20 días.
Por eso comentaba que si la fecha de pago caía en lunes, domingo, sábado o viernes estando después de los 20 días, se debería de pagar en jueves.
Espero haber sido más claro, y quedo en espera de tu apoyo y ayuda.
Gracias (xxxxxx)
Comprendo más claramente lo que necesitas pero esto tienes que hacerlo no con simples fórmulas en celdas de excel si no con una macro es decir con código de vba si te sirve puedo tratar de crear la rutina pero debo advertirte que va a ser compleja.
En una celda se captura una fecha "A1" y debo retornar en otra celda la fecha del pago "A2"; en base a la descripción que me enviaste.
Si estas de acuerdo por favor confírmamelo y tratare de ayudarte lo antes posible
Te agradecería me pudieras apoyar para resolver mi problema.
Gracias
(xxxxxx)
Logre diseñar una rutina que te permite obtener una fecha valida que corresponda unicamente con los días "Martes" y "Jueves" del calendario a partir de cualquier fecha valida que en este caso llamare "fecha de recepción"
En la celda "A1" coloque la fecha "14/08/2009" que es día "Viernes", la rutina una vez que presiones "Enter" o "Tabulador", buscara la próxima fecha que caiga específicamente en un día "Martes" o "Jueves"; esta fecha que se genera nunca llegara a 20 días después de la "fecha de recepción" siempre serán unos pocos días después.
Para que esto funcione debes hacer lo siguiente:
Tienes que tener habilitada la barra de visual basic en excel, le das botón derecho del ratón sobre la barra principal de excel después de la opción "Ayuda", aparecerá un menu contextual de donde debes seleccionar la opción "visual basic", una vez seleccionada aparecerá activa esa barra
Luego debes hacer clic en la opción de "visual basic editor" (es el cuarto icono después del icono que dice seguridad...).
Entras en el editor de visual basic del lado izquierdo esta una venta que tiene como titulo "Project - VBAProject" allí están las tres hojas (Sheets) que se generan inicialmente para todo archivo de excel, debe hacer doble clic sobre Sheet1 (Sheet1) - Hoja1(Hoja1) te aparecerá del lado derecho una venta que tiene arriba 2 combos uno tiene seleccionado (General) y el otro (Declarations); debes seleccionar del primer combo la opción "Worksheet" y del segundo combo la opción "Change".
Apereceran dos subrutinas una se llama "Worksheet_SelectionChange" y la otra "Worksheet_Change" borra completamente la que se llama "Worksheet_SelectionChange" y deja solo "Worksheet_Change"
En la subrutina "Worksheet_Change" copia este código:
Private Sub Worksheet_Change(ByVal Target As Range)
... "copia aqui"
End Sub
debe quedar asi:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fecha_pago As Date
Dim sw As Boolean
Dim dia As String
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
    If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Or ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
        If Target.Value <> "" Then
            If IsDate(Target.Value) Then
                sw = False
                fecha_pago = CDate(Target.Value)
                Do
                    fecha_pago = DateAdd("d", 1, fecha_pago)
                    Select Case Weekday(fecha_pago)
                        Case 1
                            dia = "Domingo"
                        Case 2
                            dia = "Lunes"
                        Case 3
                            dia = "Martes"
                        Case 4
                            dia = "Míercoles"
                        Case 5
                            dia = "Jueves"
                        Case 6
                            dia = "Viernes"
                        Case 7
                            dia = "Sábado"
                    End Select
                    'MsgBox "fecha: " & fecha_pago & " dia de la semana: " & dia
                    If Weekday(fecha_pago) = vbTuesday Or Weekday(fecha_pago) = vbThursday Then
                        sw = True
                    End If
                Loop While sw = False
                If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                If ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                'MsgBox "fecha de pago: " & fecha_pago & " dia de la semana: " & dia
            End If
        End If
    End If
End If
End Sub

Salva la hoja de excel ciérrala y vuelve a abrirla escribe en la celda "A1" de la Hoja1 (Sheet1) "14/08/2009" y presiona "Enter" o "Tabulador" te aparecerá en la celda "A2" "18/08/2009" y en la celda "B2" "Martes".
Como te comente es algo compleja la rutina y también como implementarla "si no estas acostumbrado a crear macros en excel con código de vba"
No estoy muy seguro de que esta rutina se adapte a lo que necesitas.
Me es difícil entender lo que quieres decir con los 20 días.
¿Si quieres que a la "fecha de recepción" se le sumen 20 días y después busque una fecha que caiga "Martes" o "Jueves" para obtener la fecha de pago?
ó
¿Si quieres que a la fecha de recepción se le vayan sumando días hasta conseguir una fecha que caiga "Martes" o "Jueves" para obtener la fecha de pago?
Si la rutina no te es funcional, puedes explicarme con más detalle que necesitas
Gracias por la ayuda
Te comento que tengo una limitante para pagar y no debe de exceder de 20 días, y mis fechas de pago serán en Martes o Jueves, así es que si la fecha más cercana después de sumar los 20 días cae por ejemplo en miércoles yo debo de regresarme al martes aunque sean menos días de los 20 establecidos .
Pudiera caer en Viernes, sábado, domingo o lunes al sumar los 20 días calendario, pero aquí debemos de regresarnos al jueves aunque el pago sea inferior a los 20 días pero se cumple lo de las fechas de pago en martes y jueves.
Espero tus comentarios
(xxxxxx)
Dejame ver si entiendo lo que necesitas
A la fecha de recepción le vas a sumar 20 días y partir de allí te vas hacia atrás y buscas una fecha que sea "Martes" o "Jueves" para que sea la fecha de pago
¿Es eso lo que necesitas que haga la rutina?
Ejemplo
Fecha de Recepción: "Jueves" "27/08/2009"
Sumo 20 días y cae el: "Miercoles" "16/09/2009"
Me voy hacia atrás y encuentro que la fecha de pago más cercana que cae "Martes" o "Jueves" es "Martes" "15/09/2009" esa es la fecha de pago
Así es, esa seria mi condicionante, estas fechas las tuve que sacar manualmente sumar 20 días y ajustarme a jueves o martes dependiendo, en algunos momentos pagare a 15 días o menos, pero no deben de ser más de 20.
Fecha de recepción rec. MATERIALES FECHA DE PAGO 25/08/2009 Jueves 10 de Septiembre de 2009 26/08/2009 Jueves 10 de Septiembre de 2009 27/08/2009 Martes 15 de Septiembre de 2009 28/08/2009 Martes 15 de Septiembre de 2009 29/08/2009 Jueves 17 de Septiembre de 2009 30/08/2009 Jueves 17 de Septiembre de 2009 31/08/2009 Jueves 17 de Septiembre de 2009
no se pego bien pero la fecha de recepción esta con este formato 25/08/2009
y la fecha programada de pago es con este formato Jueves 10 de Septiembre de 2009
(xxxxxx)
Reemplaza la rutina que te envíe por esta:
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
    If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Or ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
        If Target.Value <> "" Then
            If IsDate(Target.Value) Then
                sw = False
                fecha_pago = DateAdd("d", 20, CDate(Target.Value))
                Do
                    fecha_pago = DateAdd("d", -1, fecha_pago)
                    Select Case Weekday(fecha_pago)
                        Case 1
                            dia = "Domingo"
                        Case 2
                            dia = "Lunes"
                        Case 3
                            dia = "Martes"
                        Case 4
                            dia = "Míercoles"
                        Case 5
                            dia = "Jueves"
                        Case 6
                            dia = "Viernes"
                        Case 7
                            dia = "Sábado"
                    End Select
                    'MsgBox "fecha: " & fecha_pago & " dia de la semana: " & dia
                    If Weekday(fecha_pago) = vbTuesday Or Weekday(fecha_pago) = vbThursday Then
                        sw = True
                    End If
                Loop While sw = False
                If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                If ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                'MsgBox "fecha de pago: " & fecha_pago & " dia de la semana: " & dia
            End If
        End If
    End If
End If

Debe quedar asi:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fecha_pago As Date
Dim sw As Boolean
Dim dia As String
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
    If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Or ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
        If Target.Value <> "" Then
            If IsDate(Target.Value) Then
                sw = False
                fecha_pago = DateAdd("d", 20, CDate(Target.Value))
                Do
                    fecha_pago = DateAdd("d", -1, fecha_pago)
                    Select Case Weekday(fecha_pago)
                        Case 1
                            dia = "Domingo"
                        Case 2
                            dia = "Lunes"
                        Case 3
                            dia = "Martes"
                        Case 4
                            dia = "Míercoles"
                        Case 5
                            dia = "Jueves"
                        Case 6
                            dia = "Viernes"
                        Case 7
                            dia = "Sábado"
                    End Select
                    'MsgBox "fecha: " & fecha_pago & " dia de la semana: " & dia
                    If Weekday(fecha_pago) = vbTuesday Or Weekday(fecha_pago) = vbThursday Then
                        sw = True
                    End If
                Loop While sw = False
                If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                If ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                'MsgBox "fecha de pago: " & fecha_pago & " dia de la semana: " & dia
            End If
        End If
    End If
End If
End Sub
Disculpa olvide colocar una condición donde si después de sumar los 20 días a la fecha de recepción cae casualmente en una fecha que es "Martes" o "Jueves" no retroceda para buscar otra fecha que caiga en esos días si no que tome esa fecha como fecha de pago
Disculpa el error, reemplaza ahora si la rutina por este código
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
    If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Or ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
        If Target.Value <> "" Then
            If IsDate(Target.Value) Then
                sw = False
                fecha_pago = DateAdd("d", 20, CDate(Target.Value))
                If Weekday(fecha_pago) <> vbTuesday And Weekday(fecha_pago) <> vbThursday Then
                    Do
                        fecha_pago = DateAdd("d", -1, fecha_pago)
                        Select Case Weekday(fecha_pago)
                            Case 1
                                dia = "Domingo"
                            Case 2
                                dia = "Lunes"
                            Case 3
                                dia = "Martes"
                            Case 4
                                dia = "Míercoles"
                            Case 5
                                dia = "Jueves"
                            Case 6
                                dia = "Viernes"
                            Case 7
                                dia = "Sábado"
                        End Select
                        'MsgBox "fecha: " & fecha_pago & " dia de la semana: " & dia
                        If Weekday(fecha_pago) = vbTuesday Or Weekday(fecha_pago) = vbThursday Then
                            sw = True
                        End If
                    Loop While sw = False
                Else
                    Select Case Weekday(fecha_pago)
                            Case 1
                                dia = "Domingo"
                            Case 2
                                dia = "Lunes"
                            Case 3
                                dia = "Martes"
                            Case 4
                                dia = "Míercoles"
                            Case 5
                                dia = "Jueves"
                            Case 6
                                dia = "Viernes"
                            Case 7
                                dia = "Sábado"
                    End Select
                End If
                If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                If ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                'MsgBox "fecha de pago: " & fecha_pago & " dia de la semana: " & dia
            End If
        End If
    End If
End If

Debe quedar asi:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fecha_pago As Date
Dim sw As Boolean
Dim dia As String
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
    If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Or ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
        If Target.Value <> "" Then
            If IsDate(Target.Value) Then
                sw = False
                fecha_pago = DateAdd("d", 20, CDate(Target.Value))
                If Weekday(fecha_pago) <> vbTuesday And Weekday(fecha_pago) <> vbThursday Then
                    Do
                        fecha_pago = DateAdd("d", -1, fecha_pago)
                        Select Case Weekday(fecha_pago)
                            Case 1
                                dia = "Domingo"
                            Case 2
                                dia = "Lunes"
                            Case 3
                                dia = "Martes"
                            Case 4
                                dia = "Míercoles"
                            Case 5
                                dia = "Jueves"
                            Case 6
                                dia = "Viernes"
                            Case 7
                                dia = "Sábado"
                        End Select
                        'MsgBox "fecha: " & fecha_pago & " dia de la semana: " & dia
                        If Weekday(fecha_pago) = vbTuesday Or Weekday(fecha_pago) = vbThursday Then
                            sw = True
                        End If
                    Loop While sw = False
                Else
                    Select Case Weekday(fecha_pago)
                            Case 1
                                dia = "Domingo"
                            Case 2
                                dia = "Lunes"
                            Case 3
                                dia = "Martes"
                            Case 4
                                dia = "Míercoles"
                            Case 5
                                dia = "Jueves"
                            Case 6
                                dia = "Viernes"
                            Case 7
                                dia = "Sábado"
                    End Select
                End If
                If ActiveWorkbook.ActiveSheet.Name = "Sheet1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                If ActiveWorkbook.ActiveSheet.Name = "Hoja1" Then
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column) = fecha_pago
                    Worksheets("Sheet1").Cells(Target.Row + 1, Target.Column + 1) = dia
                End If
                'MsgBox "fecha de pago: " & fecha_pago & " dia de la semana: " & dia
            End If
        End If
    End If
End If
End Sub
Buenas tardes,
Una disculpa por no haber contestado antes pero estaba intentando aplicar el macro en la hoja de excel, pero no se si sea posible modificar la aplicación que me enviaste para que trabaje como una función que pueda ser llamada desde cualquier celda .
Por ejemplo:
=fecha_pago(dd/mm/aa)
Donde dd/mm/aa es la fecha de recepción de factura y el resultado que arrojaría la función seria la fecha de pago.
En espera de tus comentarios
Amm
Conseguí convertir el método en una función que puedes aplicar a cualquier celda, solo debes incluir este código en un modulo del archivo de excel salvarlo, cerrar el archivo de y volver abrirlo:
Public Function fecha_pago(ByRef rango As Range) As String
Dim fecha As Date
Dim dia As String
Dim sw As Boolean
If rango.Value <> "" Then
    If IsDate(rango.Value) Then
        sw = False
        fecha = DateAdd("d", 20, CDate(rango.Value))
        If Weekday(fecha) <> vbTuesday And Weekday(fecha) <> vbThursday Then
            Do
                fecha = DateAdd("d", -1, fecha)
                Select Case Weekday(fecha)
                    Case 1
                        dia = "Domingo"
                    Case 2
                        dia = "Lunes"
                    Case 3
                        dia = "Martes"
                    Case 4
                        dia = "Míercoles"
                    Case 5
                        dia = "Jueves"
                    Case 6
                        dia = "Viernes"
                    Case 7
                        dia = "Sábado"
                End Select
                If Weekday(fecha) = vbTuesday Or Weekday(fecha) = vbThursday Then
                    sw = True
                End If
            Loop While sw = False
        Else
            Select Case Weekday(fecha)
                    Case 1
                        dia = "Domingo"
                    Case 2
                        dia = "Lunes"
                    Case 3
                        dia = "Martes"
                    Case 4
                        dia = "Míercoles"
                    Case 5
                        dia = "Jueves"
                    Case 6
                        dia = "Viernes"
                    Case 7
                        dia = "Sábado"
            End Select
        End If
        fecha_pago = dia & " " & fecha
        Exit Function
    End If
End If
fecha_pago = ""
End Function

Coloca por ejemplo en la Celda A1 una fecha y en la A2 coloca la fórmula :
=fecha_pago(A1)
La función retornara un martes o un jueves dentro de los 20 días máximos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas