Anónimo
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
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 de desenex41
1
1
desenex41, Programador eventual
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
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)
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
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)
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"
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
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)
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
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)
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
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
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
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
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
- Compartir respuesta
- Anónimo
ahora mismo