Contar días hábiles

Tengo que contar 30 dias hábiles a partir de una fecha. Los sábados deben contarse como hábiles. Tengo una lista de dias festivos en el rango D2:D15. La fecha de inicio está en A2. La fórmula empleada es =DIA.LAB(A2;30;$D$2:$D$15). ¿Qué puedo hacer para que no cuente los sábados?

3 respuestas

Respuesta
1
Me has puesto a pensar! Eso me gusta.
Bueno te cuento que hice todo lo que pude por fórmulas y después de dar muchas vueltas desistí pues cada vez se me presentaba un caso diferente que hacía que no siempre funcianaran las fórmulas que probé.
Por lo tanto pensé que lo mejor era hacer una función personalizada para este cálculo y creo que funciona bien... el único inconveniente que tiene la función que hice es que las fechas de los festivos deben estar ordenadas en una sola columna de manera ascendente para que la función trabaje bien, de lo contrario arrojará resultados errados.
La función va con un procedimiento adjunto (trabajan en llave) que validar la fecha final y estar seguros de que no es domingo ni festivo, la puedes pegar en tu libro de macros personal(si la vas a utilizar en varios libros diferentes cada vez) o en el libro en donde necesites hacer el cálculo. Bueno, sin más cháchara esta es:
Function DiaLab_conSabados(inicial As Date, dias As Integer, festivos As Range) As Date
Dim final As Date
If festivos.Columns.Count > 1 Then
DiaLab_conSabados = final
Exit Function
End If
final = inicial + DateDiff("d", inicial, inicial + dias)
dia = inicial
Do While dia <= final
If WeekDay(dia) = 1 Then final = final + 1
dia = dia + 1
Loop
If WeekDay(final) = 1 Then final = final + 1
For Each Row In festivos.Rows
If IsDate(Row) Then
If inicial <= Row And final >= Row Then
final = final + 1
If WeekDay(final) = 1 Then final = final + 1
End If
End If
Next Row
Call valida(final, festivos)
DiaLab_conSabados = final
End Function
Sub valida(final As Date, festivos As Range)
Dim Esfestivo As Boolean
For Each Row In festivos.Rows
If IsDate(Row) And Row = final Then
Esfestivo = True
End If
Next Row
If WeekDay(final) = 1 Or Esfestivo Then
final = final + 1
Call valida(final, festivos)
End If
End Sub
Espero que sea lo que necesitas, yo hice bastantes pruebas y creo que funciona perfectamente... cualquier cosa me cuentas.
Si la respuesta te satisface te agradeceré una valoración a la misma acorde con su calidad y oportunidad.
Respuesta
1
Tal vez haya alguna forma alternativa con funciones propias de Excel, pero me da un poco de flojera buscarla, mucho más divertido he interesante es crear tu propia función personalizada que haga lo que tu quieras, te anexo la primer versión de una fórmula que hace lo que quieres, es parecida a la que usas
=DIA.LAB(A2;30;$D$2:$D$15)
pero esta se llama
=Dia_Laborable(A2,30,D2:D15,E1:E2)
Pero observa como tiene un cuarto argumento, ahí le estoy diciendo que omita días por día de la semana (Lunes, Martes, etc), en este ejemplo en:
E1 = 1
E2 = 7
el 1=Domingo y el 7=Sabado, le estoy diciendo que omita sabados y domingos a parte de los festivos, esto es para que veas que nos regresa el mismo valor que la funcion DIA.LAB pero lo interesante de nuestra función, es que le podemos indicar cualquier dia de la semana, por ejemplo, que solo omita los domingos u considere el sabado como habil a menos que sea festivo, como tu quieres
=Dia_Laborable(A2,30,D2:D15,E1)
Observa como ahora le dijo que solo tome el valor de E1 donde tengo el 1 que es igual al Domingo, has tus pruebas y verifica que obtengas lo que quieres, si encuentras un error o mejora no tardes en decírmelo, aquí va la función, si tienes dudas de como usarla o implementarla, puedes leer el articulo de mi página acerca de las funciones personalizadas, también, puedes solicitar el archivo donde hice las pruebas a mi correo, saludos...
http://www.vbalym.netfirms.com/excel/exfun1.html
Mauricio
MbsARROBAinboxPUNTOnet
Solo sustituye las mayúsculas por su respectivo símbolo
P.D. Si esto resuelve tu pregunta te agradeceré mucho la finalizaras, gracias...
Option Explicit
'Funcion que encuentra el siguiente dia hábil
'** ARGUMENTOS
'Fecha_Inicial = fecha a partir de la cual se empieza a contar
'Dias_Laborables = numeros de dias que se quieren contar
'Dias_Festivos = dias a omitir en la cuenta como fechas especiales
'Omitir_Dias = dias a omitir como dia de la semana
' Domingo = 1
' Lunes = 2
' etc...
' Sabado = 7
'Devuelve el dia habil siguiente como fecha
Public Function Dia_Laborable(ByVal Fecha_Inicial As Date, _
ByVal Dias_Laborables As Integer, _
ByVal Dias_Festivos As Range, _
ByVal Omitir_Dias As Range) As Date
Dim co1 As Integer
Dim r As Range
Dim EsFestivo As Boolean
Dim EsOmitido As Boolean
Dim Direccion As Integer
'Los dias laborables no pueden ser cero
If Dias_Laborables <> 0 Then
'Para saber si aumenta o disminuye la fecha
Direccion = 1
If Dias_Laborables < 0 Then Direccion = -1
Do
EsFestivo = False
EsOmitido = False
'Aumentamos o disminuimos en uno la fecha inicial
Fecha_Inicial = Fecha_Inicial + Direccion
'Buscamos en los dias festivos
For Each r In Dias_Festivos
If r.Value = Fecha_Inicial Then
'Si es festivo sale del ciclo
EsFestivo = True
Exit For
End If
Next r
'Si es festivo no es necesario buscar en dias omitidos
If Not EsFestivo Then
'Buscamos en dias omitidos en caso de que no sea festivo
For Each r In Omitir_Dias
If r.Value = Weekday(Fecha_Inicial) Then
'Si es omitido salimos del ciclo
EsOmitido = True
Exit For
End If
Next r
End If
'NO deber ser festivo ni omitido para incrementar
If Not EsFestivo And Not EsOmitido Then
co1 = co1 + 1
End If
DoEvents
'Continuamos mientras sea menor a los dias_laborables
Loop Whi
Te vuelvo a enviar la función ya que no paso completa, observa que yo uso la coma como separador de argumentos, tu usa el punto y coma...
Option Explicit
'Funcion que encuentra el siguiente dia hábil
'** ARGUMENTOS
'Fecha_Inicial = fecha a partir de la cual se empieza a contar
'Dias_Laborables = numeros de dias que se quieren contar
'Dias_Festivos = dias a omitir en la cuenta como fechas especiales
'Omitir_Dias = dias a omitir como dia de la semana
' Domingo = 1
' Lunes = 2
' etc...
' Sabado = 7
'Devuelve el dia habil siguiente como fecha
Public Function Dia_Laborable(ByVal Fecha_Inicial As Date, _
ByVal Dias_Laborables As Integer, _
ByVal Dias_Festivos As Range, _
ByVal Omitir_Dias As Range) As Date
Dim co1 As Integer
Dim r As Range
Dim EsFestivo As Boolean
Dim EsOmitido As Boolean
Dim Direccion As Integer
'Los dias laborables no pueden ser cero
If Dias_Laborables <> 0 Then
'Para saber si aumenta o disminuye la fecha
Direccion = 1
If Dias_Laborables < 0 Then Direccion = -1
Do
EsFestivo = False
EsOmitido = False
'Aumentamos o disminuimos en uno la fecha inicial
Fecha_Inicial = Fecha_Inicial + Direccion
'Buscamos en los dias festivos
For Each r In Dias_Festivos
If r.Value = Fecha_Inicial Then
'Si es festivo sale del ciclo
EsFestivo = True
Exit For
End If
Next r
'Si es festivo no es necesario buscar en dias omitidos
If Not EsFestivo Then
'Buscamos en dias omitidos en caso de que no sea festivo
For Each r In Omitir_Dias
If r.Value = Weekday(Fecha_Inicial) Then
'Si es omitido salimos del ciclo
EsOmitido = True
Exit For
End If
Next r
End If
'NO deber ser festivo ni omitido para incrementar
If Not EsFestivo And Not EsOmitido Then
co1 = co1 + 1
End If
DoEvents
'Continuamos mienstras sea menor a los dias_laborables
Loop While co1 < Abs(Dias_Laborables)
'Asignamos la fecha encontrada a la funcion
Dia_Laborable = Fecha_Inicial
Else
'Si es cero devuelve un error tipo #!VALOR¡
Dia_Laborable = ""
End If
End Function
Respuesta

Prueba lo sgiuiente. Descarga e instala el manual y ejemplos para Access y Excel del siguiente link:

Encontrará la solución de la pregunta y mucho más.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas