Funcion que suma dias habiles...

09/02/2005 - 02:47 por pepesoto | Informe spam
Hola expertos, agradezco su orientacion. Cuando doy vacaciones a mis
trabajadores se las doy sobre dias laborales, o sea, no se toma en
cuenta su dia de descanso (domingos x ejemplo) ni los dias festivos de
descanso obligatorio x ley.

Por ejemplo: Un trabajador le tocan 17 dias de vacaciones, descansa los
sabados, un dia festivo es el 5 de febrero, entonces:

Dia 1 de vacaciones: 17 enero 2005. El dia 17 de vacaciones seria el 4
febrero (recuerden que el sabado no se cuenta x ser su dia de desc).
Los dias de descanso que se atraviesan son el sab 22, 29 ene y 5 feb,
que de casualidad es festivo tambien (mala suerte). Debe regresar al
trabajo el 6 de febrero.

Esta funcion que me regalo Cesar Mera de Colombia intenta hacer este
calculo:

Option Explicit

'Funcion que suma los dias habiles de vacaciones
'** ARGUMENTOS
'Fecha_Inicial = fecha a partir de la cual se empieza a contar
'Dias_Laborables = numeros de dias de vacaciones que le tocan que se
quieren contar
'Dias_Festivos = dias a omitir en la cuenta como fechas especiales
'Omitir_Dias = dia a omitir como dia de la semana de descanso
' 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

El problema es que esta funcion me devuelve como fecha final el dia 6
de febrero, en lugar del 4. Es decir suma dias al final, y no
encuentro el por qué... Se que esta ahi pero no lo veo. Gracias
anticipadas...

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
09/02/2005 - 07:16 | Informe spam
hola, pepe !

... doy vacaciones... sobre dias laborales... no se toma en cuenta su dia de descanso... ni... festivos... x ley.
... ejemplo: ... 17 dias de vacaciones, descansa los sabados, un dia festivo es el 5 de febrero, entonces:
Dia 1 de vacaciones: 17 enero 2005. El dia 17 de vacaciones seria el 4 febrero
(recuerden que el sabado no se cuenta x ser su dia de desc) [...]
Esta funcion que me regalo Cesar Mera de Colombia intenta hacer este calculo [...]
'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 [...]
... problema es que esta funcion me devuelve como fecha final el dia 6 de febrero, en lugar del 4 [...]



creo que se trata de una cuestion de 'optica' :))
1.- dia 1 de vacaciones: 17 de enero de 2005
2.- total dias 'laborales' de vacaciones: 17
3.- 'ultimo' dia [en que el trabajador sigue de vacaciones]: 4 de febrero de 2005 [VIERNES]
4.- 'debiera presentarse a trabajar' el dia 5 de febrero de 2005 [SABADO]
5.- al ser 'su dia de descanso'... su obligacion de presentarse 'se traslada' a: 6 de febrero de 2005 [DOMINGO]

=> si observas la linea ANTES del 'Public Function Dia_.etc. etc. etc. DICE:
=> 'Devuelve el dia habil siguiente...
=> la funcion... NO devuelve ->el ultimo dia de vacaciones<- sino... ->el dia 'del regreso' al trabajo<-

si en algo me he equivocado al [tratar de] 'interpretar' tu consulta y la funcion... ¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#2 pepesoto
10/02/2005 - 02:18 | Informe spam
Me siento halagado que nuestro Gurú se haya tomado la molestia de
mirar mi duda:

En efecto mi estimado Hector. El ultimo dia de las vacaciones es el 4,
pero la funcion pone que el ultimo dia es el 6. Y si le cambias las
fechas o el dia de descanso, notaras que de cualquier forma le agrega
un dia al ultimo dia...

Quedo pendiente.


Héctor Miguel wrote:
hola, pepe !

> ... doy vacaciones... sobre dias laborales... no se toma en cuenta


su dia de descanso... ni... festivos... x ley.
> ... ejemplo: ... 17 dias de vacaciones, descansa los sabados, un


dia festivo es el 5 de febrero, entonces:
> Dia 1 de vacaciones: 17 enero 2005. El dia 17 de vacaciones seria


el 4 febrero
> (recuerden que el sabado no se cuenta x ser su dia de desc) [...]
> Esta funcion que me regalo Cesar Mera de Colombia intenta hacer


este calculo [...]
> '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 [...]
> ... problema es que esta funcion me devuelve como fecha final el


dia 6 de febrero, en lugar del 4 [...]

creo que se trata de una cuestion de 'optica' :))
1.- dia 1 de vacaciones: 17 de enero de 2005
2.- total dias 'laborales' de vacaciones: 17
3.- 'ultimo' dia [en que el trabajador sigue de vacaciones]: 4 de


febrero de 2005 [VIERNES]
4.- 'debiera presentarse a trabajar' el dia 5 de febrero de 2005


[SABADO]
5.- al ser 'su dia de descanso'... su obligacion de presentarse 'se


traslada' a: 6 de febrero de 2005 [DOMINGO]

=> si observas la linea ANTES del 'Public Function Dia_.etc. etc.


etc. DICE:
=> 'Devuelve el dia habil siguiente...
=> la funcion... NO devuelve ->el ultimo dia de vacaciones<- sino...


->el dia 'del regreso' al trabajo<-

si en algo me he equivocado al [tratar de] 'interpretar' tu consulta


y la funcion... ¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#3 Héctor Miguel
10/02/2005 - 06:20 | Informe spam
hola, pepe !

... en efecto... ultimo dia de las vacaciones es el 4, pero la funcion pone que el ultimo dia es el 6.
... si le cambias las fechas o el dia de descanso... de cualquier forma le agrega un dia al ultimo dia [...]



1.- 'tengo que insistir' en que la funcion 'hace' -exactamente- lo que 'se espera' [segun el codigo]
=> NO devuelve [lo que es/fue/sera] 'el ultimo dia' [en que aun esta 'de vacaciones']
=> TE devuelve [lo que es/fue/sera] 'el primer dia laborable siguiente' [segun su dia 'de descanso' y demas]
segun los comentarios del autor [Cesar Mera de Colombia] al inicio de la funcion...
' Funcion que suma los dias habiles de vacaciones [devuelve el dia habil siguiente como fecha]
' ** ARGUMENTOS
' Fecha_Inicial = fecha a partir de la cual se empieza a contar
' Dias_Laborables = numeros de dias de vacaciones que le tocan que se quieren contar
' Dias_Festivos = dias a omitir en la cuenta como fechas especiales <= este es un argumento 'Rango'
' Omitir_Dias = dia a omitir como dia de la semana de descanso [Domingo=1... Sabado=7]

2.- creo que la 'intencion' [de Cesar] al devolver 'el dia habil siguiente' es acertada ;)
[creo que 'lo usual' cuando alguien esta de vacaciones es preguntar: ->¿cuando REGRESA?<-

3.- yo solo 'le quitaria' [al codigo de la funcion] la instruccion 'DoEvents'
[ocasiona que 'pierdas' el beneficio del 'deshacer'... 'undo'... ctrl+z] ;)

4.- he notado que la funcion trabaja tambien 'a la inversa'
-> si proporcionas la fecha en que 'regresa' como argumento 'Fecha_Inicial'
-> y proporcionas ->en negativo<- el argumento 'Dias_Laborables'
-> te devuelve [lo que es/fue/seria] =>el primer dia 'laborable' EN vacaciones<= [como fecha]

5.- haciendo una 'combinacion' de funciones de hoja de calculo [que resultan en una formula ->matricial<-]
puedes obtener el mismo resultado que la funcion personalizada [usando los mismos argumentos_nombre]...
=> toma nota que mi separador de argumentos es la coma ',' NO punto y coma ';'
y que 'la formula' debera quedar en una sola linea [la separo por 'cuestiones esteticas'] :))
=fecha_inicial
+k.esimo.menor(
si((diasem(fecha_inicial+(fila(indirecto("1:"&dias_laborables*10))))<>omitir_dias)*
esnod(coincidir(fecha_inicial+(fila(indirecto("1:"&dias_laborables*10))),dias_festivos,0)),
fila(indirecto("1:"&dias_laborables*10))),dias_laborables)

6.- si deseas que la funcion tambien 'trabaje a la inversa' [invirtiendo obviamente la 'Fecha_Inicial']...
sustituye [en 'la formula'] + por - antes de 'k.esimo.menor' y antes de '(fila(indirecto(...'
[o podrias intercalar la funcion 'Signo()' para detectar si es 'en avance' o 'en retroceso'] ;)

creo [segun yo] que no deberan de 'quedar dudas'... :))
[por si las dudas...] ¿comentas cualquier detalle adicional?
saludos,
hector.
Respuesta Responder a este mensaje
#4 pepesoto
10/02/2005 - 08:27 | Informe spam
Eres muy amable Hector M. A ver si nos queda mas claro con este cuadro
porque asi se lo tengo que dar a mi trabajador:

Trabajador: Hector Miguel
Dias a que tiene derecho: 17
a) Su dia de descanso es: Sabado
b) Su primer dia de vacaciones es: 17 enero 2005
c) Su ultimo dia de vacaciones es: 04 febrero 2005
d) Ud debe regresar a trabajar el: Domingo 6 febrero 2005

La formula se la pongo en el inciso d)
Desafortunadamente es obligatorio entregarle este desglose al
trabajador, asi que entonces me falta la formula que tendria que poner
en el inciso c), x ej:
=+SI(DIASEM(inciso_d,1)-1=omitir_dias,inciso_d-2,inciso_d-1), pero me
pone como resultado el 5 de febrero... Help!

Héctor Miguel wrote:
hola, pepe !

> ... en efecto... ultimo dia de las vacaciones es el 4, pero la


funcion pone que el ultimo dia es el 6.
> ... si le cambias las fechas o el dia de descanso... de cualquier


forma le agrega un dia al ultimo dia [...]

1.- 'tengo que insistir' en que la funcion 'hace' -exactamente- lo


que 'se espera' [segun el codigo]
=> NO devuelve [lo que es/fue/sera] 'el ultimo dia' [en que aun esta


'de vacaciones']
=> TE devuelve [lo que es/fue/sera] 'el primer dia laborable


siguiente' [segun su dia 'de descanso' y demas]
segun los comentarios del autor [Cesar Mera de Colombia] al


inicio de la funcion...
' Funcion que suma los dias habiles de vacaciones [devuelve el


dia habil siguiente como fecha]
' ** ARGUMENTOS
' Fecha_Inicial = fecha a partir de la cual se empieza a contar
' Dias_Laborables = numeros de dias de vacaciones que le tocan


que se quieren contar
' Dias_Festivos = dias a omitir en la cuenta como fechas


especiales <= este es un argumento 'Rango'
' Omitir_Dias = dia a omitir como dia de la semana de descanso


[Domingo=1... Sabado=7]

2.- creo que la 'intencion' [de Cesar] al devolver 'el dia habil


siguiente' es acertada ;)
[creo que 'lo usual' cuando alguien esta de vacaciones es


preguntar: ->¿cuando REGRESA?<-

3.- yo solo 'le quitaria' [al codigo de la funcion] la instruccion


'DoEvents'
[ocasiona que 'pierdas' el beneficio del 'deshacer'... 'undo'...


ctrl+z] ;)

4.- he notado que la funcion trabaja tambien 'a la inversa'
-> si proporcionas la fecha en que 'regresa' como argumento


'Fecha_Inicial'
-> y proporcionas ->en negativo<- el argumento 'Dias_Laborables'
-> te devuelve [lo que es/fue/seria] =>el primer dia 'laborable'


EN vacaciones<= [como fecha]

5.- haciendo una 'combinacion' de funciones de hoja de calculo [que


resultan en una formula ->matricial<-]
puedes obtener el mismo resultado que la funcion personalizada


[usando los mismos argumentos_nombre]...
=> toma nota que mi separador de argumentos es la coma ',' NO punto y


coma ';'
y que 'la formula' debera quedar en una sola linea [la separo


por 'cuestiones esteticas'] :))
=fecha_inicial
+k.esimo.menor(



si((diasem(fecha_inicial+(fila(indirecto("1:"&dias_laborables*10))))<>omitir_dias)*



esnod(coincidir(fecha_inicial+(fila(indirecto("1:"&dias_laborables*10))),dias_festivos,0)),
fila(indirecto("1:"&dias_laborables*10))),dias_laborables)

6.- si deseas que la funcion tambien 'trabaje a la inversa'


[invirtiendo obviamente la 'Fecha_Inicial']...
sustituye [en 'la formula'] + por - antes de 'k.esimo.menor' y


antes de '(fila(indirecto(...'
[o podrias intercalar la funcion 'Signo()' para detectar si es


'en avance' o 'en retroceso'] ;)

creo [segun yo] que no deberan de 'quedar dudas'... :))
[por si las dudas...] ¿comentas cualquier detalle adicional?
saludos,
hector.
Respuesta Responder a este mensaje
#5 Héctor Miguel
10/02/2005 - 08:59 | Informe spam
hola, pepe !

... mas claro con este cuadro porque asi se lo tengo que dar a mi trabajador:
Trabajador: Hector Miguel
Dias a que tiene derecho: 17
a) Su dia de descanso es: Sabado
b) Su primer dia de vacaciones es: 17 enero 2005
c) Su ultimo dia de vacaciones es: 04 febrero 2005
d) Ud debe regresar a trabajar el: Domingo 6 febrero 2005
La formula se la pongo en el inciso d)
... me falta la formula que tendria que poner en el inciso c) [...]



[sencillo] usando la 'variante' para la busqueda de dias 'laborables' ->en reversa<-...
1.- tomar como punto de partida [o fecha_inicial] ->la fecha de su regreso<- [el inciso d)]
2.- buscar 'en reversa' UN dia [o los que fueran 'aplicables'] con las mismas condiciones 'fijas' [los festivos]
una formula para el inciso c) ->mismos comentarios anteriores<-
=fecha_regreso
-k.esimo.menor(
si((diasem(fecha_regreso-(fila(indirecto("1:10"))))<>omitir_dias)*
esnod(coincidir(fecha_regreso-(fila(indirecto("1:10"))),dias_festivos,0)),
fila(indirecto("1:10"))),1)

¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida