Calcul du nombre de jour ouvrés entre deux dates

Numéro d'article: 466831 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F16831
Agrandir tout | Réduire tout

Résumé

Comment calculer le nombre de jour ouvrés entre 2 dates tout en tenant
compte des jours fériés.

Le principe de la fonction JourOuvrés est simple. Il se décompose en
trois phases , la première permet le positionnement sur un Lundi. La
seconde phase compte le nombre de semaines pleines (valeur entière du
nombre de jours divisé par 7). La dernière phase consiste au traitement
des jours restants. Pour illustrer cette technique prenons un exemple :

Supposons que nous cherchions à déterminer le nombre de jours ouvrés
compris entre le 1 Août 1996 et le 31 Août 1996.

La première phase nous place sur le Lundi 5 Août 1996, le nombre de jours
ouvrés comptabilisé pour ce positionnement est de 1, Par contre nous
avons traité 3 Jours réels. A partir de là, il nous faut calculer le
nombre de semaines pleines dans la période restante soit :

Valeur entière de ((31-4)/7) = 3

Donc 3 semaines pleines de 7 jours (mais 5 ouvrés).
A ce stade, nous avons traité 4 Jours + 21, soit 25 jours, par contre
cela fait 2+15 soit 17 jours ouvrés.

La troisième phase permet le traitement des jours restants (6 jours).
Mais nous n'en comptons que 5 pour `effacer' le Samedi.

Dans cet exemple, nous ne prenons pas en compte le 15 Août 1996. Ce jour
est à décompté car il s'agit d'un Jeudi. Il est important de vérifier le
numéro de jour de chaque jour férié compris entre la date de début et de
fin.
En effet, nous avons des cas où le jour férié se trouve déjà décompter,
simplement parce qu'il tombe sur un Samedi ou un Dimanche (Dimanche 14
Juillet 1996, par exemple).
Si nous décomptons les jours fériés, le résultat devient 21 jours ouvrés
et 29 réels.


Résumons :


Opérations Jours ouvrés Jours réels

Première semaine 1 3
Semaines pleines 15 21
Dernière semaine 5 6

Total 21 30
Suppression du 15 Août 20 29


La fonction JourOuvrés reçoit 2 où 3 paramètres, le 3ème étant
facultatif. Ce troisième paramètre facultatif est un tableau des jours
fériés. Dans le cas ou ce paramètre est renseigné, le décompte des jours
fériés est opéré. Il est donc possible d'utiliser cette fonction année
après année.

Test de la fonction

Créons un nouveau formulaire dans lequel nous ajoutons 4 zones de texte
(Textbox) nommés respectivement (Text1, Text2, Text3 et Text4). Text1 et
Text2 permettent la saisie des dates de début et de fin. Text3 contiendra
en retour le nombre de jours ouvrés séparant ces deux dates. Text4
affichera pour sa par le nombre réel de jours. Il nous faudra également
une case à cocher (CheckBox) pour permettre la prise en compte ou non des
jours fériés. Puis enfin, un bouton de commande.

L'événement click du bouton aura pour code :

Private Sub Command1_Click()

Dim TabFériés(10) As Variant
TabFériés(0) = DateSerial(1996, 1, 1)
TabFériés(1) = DateSerial(1996, 5, 1)
TabFériés(2) = DateSerial(1996, 5, 8)
TabFériés(3) = DateSerial(1996, 5, 16)
TabFériés(4) = DateSerial(1996, 5, 27)
TabFériés(5) = DateSerial(1996, 7, 10)
TabFériés(6) = DateSerial(1996, 8, 15)
TabFériés(7) = DateSerial(1996, 11, 1)
TabFériés(8) = DateSerial(1996, 11, 11)
TabFériés(9) = DateSerial(1996, 12, 25)

'Prise en compte des jours fériés ?
If Check1.Value = 1 Then
Text3.Text = JourOuvrés(DateValue(Text1.Text),
DateValue(Text2.Text), TabFériés)
Else
Text3.Text = JourOuvrés(DateValue(Text1.Text),
DateValue(Text2.Text))
End If
Text4.Text = DateDiff("d", DateValue(Text1.Text),
DateValue(Text2.Text))
End Sub


Avant de mettre cette fonction de calcul en utilisation réelle,
assurez-vous qu'aucune erreur de frappe ne s'est glissée. Pour ce faire,
voici un tableau de dates avec les résultats devant être retournés si le
code est correct :

Sans prendre en compte les jours fériés :

Date Début Date Fin Jours réels Jours ouvrés
01/01/96 14/01/96 13 9
13/04/96 19/04/96 6 5
01/01/96 29/02/96 59 43

En tenant compte des jours fériés :

Date Début Date Fin Jours réels Jours ouvrés
01/07/96 31/07/96 30 21
01/08/96 31/08/96 29 20


Voici le code du module écrit pour Visual Basic 4 :


Option Explicit

Function JourOuvrés(DateDebut As Date, DateFin As Date, Optional Fériés
As Variant)

' Datedeb contient la date de départ
' Datefin contient la date de fin
' Fériés est un paramètre optionnel qui contient les dates fériés

Dim NumJour, test As Integer
Dim TotalJour As Integer
Dim JourTrait As Integer
Dim posJour As Integer
Dim Semaine As Integer
Dim I As Integer

NumJour = 0 ' Numéro de jour dans la semaine
TotalJour = 0 ' Total de jour à traité
JourTrait = 0 ' Nombre de jour déjà traité
posJour = 0 ' Jour en cours de traitement
Semaine = 0 ' Nombre de semaine pleines


'Combien de jours a traités
TotalJour = DateDiff("d", DateDebut, DateFin)

'Recherche du Numéro de Jour dans la semaine de DateDebut
NumJour = WeekDay(DateDebut, 1)

'******************************
'Traitement du début de semaine
'******************************
'Nous allons chercher à nous positionner sur le premier Lundi
If NumJour = 1 Or NumJour = 7 Then
' Dans ce cas nous sommes sur un Dimanche ou un Samedi
If NumJour = 7 Then
' C'est un samedi
JourTrait = 1 ' Car on à traité Dimanche
posJour = 2 ' De ce fait on à traité 2 Jours
End If
Else
If TotalJour < 7 Then
'Le total fait moins de 7 jours
'Le début est en milieu de semaine
If TotalJour + NumJour < 6 Then
JourTrait = TotalJour
JourOuvrés = TotalJour
End If
Else
' Nous avons plus de 7 jours, avec un début en milieu de
' semaine
JourTrait = (7 - NumJour) + 1
JourOuvrés = 6 - NumJour
End If
End If
'**********************************************************
'Traitement des semaines pleines, et de la dernière semaine
'**********************************************************
If JourTrait < TotalJour Then
' Traitement des semaines pleines
Semaine = Int((TotalJour - JourTrait) / 7)
If Semaine > 0 Then
JourOuvrés = JourOuvrés + (Semaine * 5)
JourTrait = JourTrait + (Semaine * 7)
End If
' Puis traitement des jours restants
If TotalJour - JourTrait = 6 Then
JourOuvrés = JourOuvrés + 5
Else
JourOuvrés = JourOuvrés + (TotalJour - JourTrait)
End If

End If


'Gestion des Jours Fériés
'Il nous suffit de balayer le tableau optionnel des
'jours fériés, puis de tester s'ils font partie de l'intervalle,
'et s'ils ne tombent pas sur un Samedi ou un Dimanche

If Not IsMissing(Fériés) Then
For I = 0 To UBound(Fériés, 1)
If Fériés(I) >= DateDebut And Fériés(I) <= DateFin Then
If WeekDay(Fériés(I), 1) <> 1 And WeekDay(Fériés(I), 1) <> 7
Then
' à décompter !
JourOuvrés = JourOuvrés - 1
End If
End If
Next I
End If
End Function

Propriétés

Numéro d'article: 466831 - Dernière mise à jour: jeudi 12 février 2004 - Version: 3.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic 4.0 Édition Standard
  • Microsoft Visual Basic 4.0 Édition Standard
Mots-clés : 
pgm KB466831
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com