Formulaire de planning pour la gestion des présences et des absences

Denis Hulo

Objectif : apprendre à créer un formulaire de planning permettant de gérer les heures de présence et les absences du personnel.

Niveau requis : intermédiaire.

Commentez cet article : Commentez

- Titre : Formulaire de planning pour la gestion des présences et des absences

- Auteur : Denis Hulo

- Parution : 24 octobre 2009

- Mise à jour : 22 septembre 2019

- Public visé :

- Licence : Copyright ® 2009 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Aperçu du formulaire de planning

- III. Tables nécessaires

- III-A. Table T_Employe

- III-B. Table T_PeriodeJour

- III-C. Table T_Planning

- III-D. Table T_MotifAbsence

- IV. Requêtes

- IV-A. Requête R_Planning

- IV-B. Requête R_EmployePeriodeJour

- IV-C. Requête R_PlanningEmploye

- IV-D. Requête R_Planning_Analyse_Croisee

- V. Formulaires

- V-A. Sous-formulaire SF_Planning

- V-A-1. Zones de texte « Jour.. »

- V-A-1-a. Mise en forme conditionnelle

- V-A-1-b. Procédure évènementielle sur Double clic

- V-A-2. Fonction OuvrirFormSaisie

- V-B. Formulaire F_Planning

- V-B-1. Liste déroulante cmbMois

- V-B-1-a. Procédure évènementielle sur AfterUpdate

- V-B-2. Liste déroulante cmbAnnee

- V-B-2-a. Procédure évènementielle sur AfterUpdate

- V-B-3. Boutons de commande CmdPrecedent et CmdSuivant

- V-B-3-a. Procédure évènementielle sur clic du bouton CmdPrecedent

- V-B-3-b. Procédure évènementielle sur clic du bouton CmdSuivant

- V-C. Formulaire F_SaisiePlanning

- V-C-1. Bouton de commande CmdValider

- V-C-1-a. Procédure évènementielle sur Clic

- V-C-2. Bouton de commande CmdAnnuler

- V-C-2-a. Procédure évènementielle sur Clic

- V-C-3. Bouton de commande CmdSupprimer

- V-C-3-a. Procédure évènementielle sur Clic

- VI. Module M_Planning

- VI-A. Quelques fonctions importantes

- VI-B. Procédure MajPlanning

- VII. Paramétrage du planning

- VIII. Application à télécharger

- IX. Remerciements

I - Introduction

Après avoir donné un aperçu du formulaire souhaité, on décrira la structure des différents objets de l'application exemple, dans l'ordre de leur création.

L'article comportera donc cinq parties principales :

- aperçu du formulaire de planning ;

- tables nécessaires ;

- requêtes ;

- formulaires ;

- module M_Planning.

Pour conclure, on proposera un exemple de paramétrage du planning.

II - Aperçu du formulaire de planning

Voici le rendu du planning avec les heures de présence et les absences du personnel pour le mois choisi :

Planning mensuel

Il comporte, en tête des lignes, les noms des personnes et, en tête des colonnes, les jours du mois.

L'ajout ou la suppression d'une absence se faisant naturellement par un double clic dans la case correspondante.

III - Tables nécessaires

Nous allons tout d'abord détailler les tables permettant d'enregistrer les données.

III-A - Table T_Employe

Elle contient simplement la liste des nom et prénom des employés de l'entreprise accompagnés de leur identifiant.

Structure de la table :

Nom du champ

Type de données

Description

IdEmploye

Entier long

Identifiant de l'employé

NomEmploye

Texte

Nom de l'employé

PrenomEmploye

Texte

Prénom de l'employé

…

…

…

Exemple de données enregistrées dans la table :

IdEmploye

NomEmploye

PrenomEmploye

1

AUDINET

Noël

2

DE GIORGI

Aldo

…

…

…

Vous pouvez naturellement ajouter à cette table d'autres champs comme la date d'entrée et de sortie de l'employé.

III-B - Table T_PeriodeJour

Elle contient les deux périodes de la journée : matin ou après-midi.

Structure de la table :

Nom du champ

Type de données

Description

PeriodeJour

Texte

Période de la journée : matin ou après-midi

NumOrdre

Entier long

Numéro d'ordre de la période, pour ordonner les périodes

Exemple de données enregistrées dans la table :

PeriodeJour

NumOrdre

Matin

1

Après-midi

2

III-C - Table T_Planning

Elle sert à enregistrer les absences ou le nombre d'heures effectuées par l'employé à une date et à une période données.

Structure de la table :

Nom du champ

Type de données

Description

IdPlanning

Numéro-auto

Identifiant

IdEmploye

Entier long

Identifiant de l'employé

DateJour

Date

Date du jour de présence ou d'absence de l'employé

PeriodeJour

Texte

Période de la journée : matin ou après-midi

IdMotifAbsence

Texte

Code du motif d'absence de l'employé (MA : Maladie, MT : Materinité, F : Formation, P : Présence…)

NbHeures

Numérique

Nombre d'heures à effectuer si présent

Exemple de données enregistrées :

IdPlanning

IdEmploye

DateJour

PeriodeJour

IdMotifAbsence

NbHeures

59

20

14/10/2019

Matin

F

60

20

15/10/2019

Matin

F

61

20

16/10/2019

Matin

F

…

…

…

…

…

…

En plus de l'identifiant de l'employé, il nous faut donc sauvegarder la date et la période du jour (matin, après-midi).

III-D - Table T_MotifAbsence

Elle contient la liste des motifs d'absence que peut avoir un employé.

Structure de la table :

Nom du champ

Type de données

Description

IdMotifAbsence

Texte

Identifiant du motif d'absence (MA : Maladie, MT : Materinité, F : Formation…)

MotifAbsence

Texte

Intitulé du motif de l'employé (Maladie, Maternité, Formation, Personnel…)

Exemple de données enregistrées :

IdMotifAbsence

MotifAbsence

AC

Accident

C

Congé

F

Formation

…

…

IV - Requêtes

Pour pouvoir afficher le tableau des heures de présence et des absences, avec en lignes les employés et en colonnes les jours du mois, il nous faut créer une requête analyse croisée.

Pour cela, on va d'abord créer les requêtes R_Planning et R_PersonnelPeriodeJour, puis la requête R_PlanningEmploye basée sur les deux premières.

Détaillons donc ces différents objets.

IV-A - Requête R_Planning

Cette requête, basée sur la table T_Planning, affiche la liste des heures de présence et les absences des employés pour le mois et l'année sélectionnés sur le formulaire.

Elle a donc comme paramètres les listes déroulantes cmbMois et cmbAnnee du formulaire F_Planning.

Structure de la requête :

Requête R_Planning en mode création.

Formule utilisant la fonction vraifaux(condition; sivrai; sifaux) pour afficher les motifs d'absence ou le nombre d'heures effectuées par l'employé :

AbsPres: VraiFaux(EstNull([IdMotifAbsence]);[NbHeures];[IdMotifAbsence])

S'il n'y a pas de motif d'absence, elle renvoie le nombre d'heures, sinon le résultat de la fonction est simplement le motif d'absence.

Exemple d'affichage de la requête pour le mois d'octobre de l'année 2019 :

IdEmploye

DateJour

PeriodeJour

AbsPres

20

15/10/2019

Matin

F

20

16/10/2019

Matin

F

20

17/10/2019

Matin

F

20

18/10/2019

Matin

F

…

…

…

…

Ici, on a enregistré comme motif d'absence « F » pour « Formation ».

IV-B - Requête R_EmployePeriodeJour

Cette requête effectue le produit cartésien entre les tables T_Employe et T_PeriodeJour, elle affiche donc pour chaque employé, les deux périodes de la journée (matin, après-midi).

Structure de la requête :

Requête R_EmployePeriodeJour en mode création.

Exemple d'affichage de la requête :

Employe

IdEmploye

PeriodeJour

NumOrdre

BOLLANI Marc

10

Matin

1

BOLLANI Marc

10

Après-midi

2

CAILLE Michel

25

Matin

1

CAILLE Michel

25

Après-midi

2

…

…

…

…

Les données sont classées par employé et numéro d'ordre de la période.

IV-C - Requête R_PlanningEmploye

Cette requête réalise une jointure gauche entre les requêtes R_PersonnelPeriodeJour et R_Planning. Elle permet d'afficher tous les employés, ainsi que leurs nombres d'heures ou leurs absences enregistrés dans le mois.

Structure de la requête :

Requête R_PlanningEmploye en mode création.

On effectue une jointure gauche entre les deux requêtes pour pouvoir afficher tous les employés et leurs périodes.

Exemple d'affichage de la requête pour le mois d'octobre de l'année 2019 :

Employe

IdEmploye

PeriodeJour

NumOrdre

JourMois

AbsPres

BOLLANI Marc

10

Matin

1

15

F

BOLLANI Marc

10

Après-midi

2

16

F

CAILLE Michel

25

Matin

1

17

F

CAILLE Michel

25

Après-midi

2

18

F

…

…

…

…

…

…

Ici, on a enregistré comme motif d'absence « F » pour « Formation ».

IV-D - Requête R_Planning_Analyse_Croisee

Elle se base sur la requête R_PlanningEmploye, et affiche un tableau avec en tête des lignes les noms des employés et les périodes du jour, en tête des colonnes les jours du mois choisi (1,2,3…31), et à l'intersection des lignes et des colonnes le motif de l'absence ou le nombre d'heures réalisées par l'employé.

Structure de la requête :

Requête R_Planning_Analyse_Croisee en mode création.

Exemple d'affichage de la requête pour le mois d'octobre de l'année 2019 :

Affichage de la requête R_Planning_Analyse_Croisee

V - Formulaires

La troisième étape consiste à créer les formulaires.

V-A - Sous-formulaire SF_Planning

Ce formulaire, en mode continu, est relié à la requête analyse croisée. Il contient les zones de texte Employe, IdEmploye et PeriodeJour, pour les en-têtes de lignes, et les 31 zones de texte reliées aux jours du mois (1,2…31) :

Sous-formulaire SF_Planning en mode création

V-A-1 - Zones de texte « Jour.. »

Les 31 zones de texte (Jour1..Jour31) reliées aux champs 1..31, correspondant aux 31 colonnes de la requête analyse croisée.

V-A-1-a - Mise en forme conditionnelle

En mode création du sous-formulaire, on sélectionne une zone de texte associé à un jour, puis dans le menu Format, on choisit mise en forme conditionnelle, enfin, on définit les différentes couleurs en fonction des motifs d'absence (MA : Maladie, MT : Materinité, F : Formation, P : Personnel) :

Définition de la mise en forme conditionnelle des zones de texte.

V-A-1-b - Procédure évènementielle sur Double clic

Cette procédure permet d'ouvrir le formulaire F_SaisiePlanning sur l'employé, la période et le jour correspondant à la case double cliquée sur le planning.

Le code sur l'événement ouverture du sous-formulaire et permettant d'affecter la fonction d'ouverture du formulaire de saisie à la propriété double clic des zones de texte Jour1..31 :

Private Sub Form_Open(Cancel As Integer)
Dim j As Long
...
For j = 1 To 31 ' parcours des 31 zones de texte liées aux jours
' affectation de la fonction à la propriété OnDblClick des zones de texte liées aux jours
Me("Jour" & j).OnDblClick = "=OuvrirFormSaisie(" & j & ")"
Next j
End Sub

V-A-2 - Fonction OuvrirFormSaisie

Cette fonction publique fait partie du module M_Planning et permet d'ouvrir le formulaire F_SaisiePlanning sur l'employé et le jour correspondant à la case double cliquée sur le planning :

Public Function OuvrirFormSaisie(j As Integer)
' Permet d'ouvrir le formulaire de saisie correspondant à la ligne et la colonne sur lesquels on a double-cliqués
Dim dtJour As Date, IdPlanning As Long
Dim IdEmploye As Long, prJour As String

dtJour = DateSerial(Forms!F_Planning!cmbAnnee, Forms!F_Planning!cmbMois, j) ' date du jour correspondant à la colonne d'indice j
prJour = Forms!F_Planning!SF_Planning.Form!PeriodeJour ' Période du jour correspondant à la ligne cliquée sur le planning
IdEmploye = Forms!F_Planning!SF_Planning.Form!IdEmploye ' Identifiant de l'employé correspondant à la ligne cliquée sur le planning

If (Nz(Forms!F_Planning!SF_Planning.Form("Jour" & j)) = "") Then ' si pas de motif d'absence ou d'heures d'enregistrées

DoCmd.OpenForm "F_SaisiePlanning", , , , acFormAdd ' Ouverture du formulaire de saisie en mode ajout

Forms!F_SaisiePlanning!IdEmploye.Value = IdEmploye ' mise à jour de l'identifiant de l'employé sur le formulaire de saisie
Forms!F_SaisiePlanning!DateDebut.Value = dtJour ' mise à jour de la date du début sur le formulaire de saisie
Forms!F_SaisiePlanning!DateFin.Value = dtJour ' mise à jour de la date de fin sur le formulaire de saisie
Forms!F_SaisiePlanning!PeriodeJour.Value = prJour ' mise à jour de la période du jour sur le formulaire de saisie

Else

IdPlanning = Nz(DLookup("IdPlanning", "T_Planning", "[IdEmploye]=" & IdEmploye & " and [DateJour] = " & FormatDateUs(dtJour) & " and [PeriodeJour] = '" & prJour & "'"), 0)

' ouverture du formulaire de saisie sur l'id. planning correspondant à l'employé, au jour et à la période choisis sur le planning
DoCmd.OpenForm "F_SaisiePlanning", , , "[IdPlanning]=" & IdPlanning

Forms!F_SaisiePlanning!DateFin.Value = dtJour ' mise à jour de la date de fin sur le formulaire de saisie

End If
End Function

V-B - Formulaire F_Planning

Il contient les zones de listes déroulantes cmbMois et cmbAnnee, les boutons de commande pour avancer ou reculer d'un mois, et le sous-formulaire SF_Planning.

Formulaire F_Planning en mode création

V-B-1 - Liste déroulante cmbMois

Ce contrôle est utilisé pour permettre à l'utilisateur de sélectionner un mois, et ainsi d'afficher le planning du mois choisi.

V-B-1-a - Procédure évènementielle sur AfterUpdate

Cette procédure s'exécute quand on choisit un mois dans la liste déroulante : elle permet d'afficher le planning du mois choisi.

Private Sub cmbMois_AfterUpdate()
' Mise à jour du planning.
MajPlanning
End Sub

V-B-2 - Liste déroulante cmbAnnee

Ce contrôle est utilisé pour permettre à l'utilisateur de sélectionner une année, et ainsi d'afficher le planning du mois et de l'année choisis.

V-B-2-a - Procédure évènementielle sur AfterUpdate

Cette procédure s'exécute quand on choisit une année dans la liste déroulante : elle permet d'afficher le planning du mois et de l'année choisis.

Private Sub An_AfterUpdate()
' Mise à jour du planning.
MajPlanning
End Sub

V-B-3 - Boutons de commande CmdPrecedent et CmdSuivant

Ces boutons de commande situés en haut à droite permettent d'avancer ou de reculer d'un mois sur le planning.

V-B-3-a - Procédure évènementielle sur clic du bouton CmdPrecedent

Ce code permet de reculer d'un mois et de mettre à jour le planning sur le formulaire.

Private Sub CmdPrecedent_Click()

If (Me.cmbMois.value > 1) Then ' Si le mois est supérieur à 1 (janvier),
Me.cmbMois = Me.cmbMois.value- 1 ' affiche le mois précédent.

Else ' sinon si le mois affiché est janvier (1er mois de l'année)
Me.cmbMois = 12 ' affiche le dernier mois
Me.cmbAnnee = Me.cmbAnnee - 1 ' et l'année précédente.
End If
MajPlanning ' actualise le planning
End Sub

Si la liste cmbMois affiche le mois de janvier, on recule d'une année et on passe au mois de décembre, sinon, on passe simplement au mois précédent.

V-B-3-b - Procédure évènementielle sur clic du bouton CmdSuivant

Ce code permet d'avancer d'un mois et de mettre à jour le planning sur le formulaire.

Private Sub CmdSuivant_Click()

If (Me.cmbMois.value < 12) Then ' Si le mois est inférieur à 12 (décembre),
Me.cmbMois = Me.cmbMois.value + 1 ' affiche le mois suivant.
Else ' sinon si le mois affiché est décembre (dernier mois de l'année)
Me.cmbMois = 1 ' affiche le premier mois
Me.cmbAnnee = Me.cmbAnnee + 1 ' et l'année suivante.
End If
MajPlanning ' actualise le planning
End Sub

Si la liste cmbMois affiche le mois de décembre, on avance d'une année et on passe au mois de janvier, sinon, on passe simplement au mois suivant.

V-C - Formulaire F_SaisiePlanning

Formulaire de saisie d'un nombre d'heures ou d'une absence d'un employé pour un jour et une période donnés.

Formulaire F_SaisiePlanning en mode création

V-C-1 - Bouton de commande CmdValider

Permet de valider la saisie.

V-C-1-a - Procédure évènementielle sur Clic

Déroulé de la procédure :

- on teste si un motif d'absence ou un nombre d'heures a été saisi ;

- si c'est le cas, on vérifie si une absence a déjà été enregistrée dans la période ;

- si la période est libre, on enregistre l'absence pour chacun des jours compris dans la période ;

- enfin, on actualise le planning et on ferme le formulaire de saisie.

Procédure évènementielle CmdValider_Click

Private Sub CmdValider_Click()
' Valide la saisie en enregistrant les changements dans la base et en actualisant le planning
Dim n As Long, dd As Date, df As Date
Dim rs As DAO.Recordset
Dim db As DAO.Database

If MsgBox("Souhaitez-vous ajouter des Absences/présences ?", vbYesNo + vbQuestion) = vbNo Then
Exit Sub
End If

If (Nz(Me.IdMotifAbsence) <> "") Or (Nz(Me.NbHeures) <> "") Then ' si un motif d'absence ou un nombre d'heures a été saisis

dd = CDate(Me!DateDebut) ' on copie dans la variable la date de début indiquée sur le formulaire
df = CDate(Me!DateFin) ' on copie dans la variable la date de fin affichée sur le formulaire

If (CDate(Me!DateDebut.Value) <= CDate(Me!DateFin.Value)) Then

n = Nz(DLookup("IdPlanning", "T_Planning", "([IdPlanning]<>" & Nz(Me!IdPlanning.Value, 0) & ") and ([IdEmploye]=" & Nz(Me.IdEmploye.Value, 0) & ") and DateJour between " & FormatDateUs(dd) & " and " & FormatDateUs(df) & " and (PeriodeJour='" & Me.PeriodeJour & "')"), 0)

If n = 0 Then ' période disponible, pas de présences pour cet employé sur cette période

Set db = CurrentDb ' référence à la base courante
Set rs = db.OpenRecordset("T_Planning", dbOpenDynaset) ' ouverture du recordset basé sur la table T_Planning

dd = dd + 1

Do While (dd <= df) ' parcourt des jours de la période

' Si pas un week-end ou un jour férié
If (Not EstWeekEnd(dd)) And Not (EstFerie(dd)) Then
rs.AddNew
rs!IdEmploye = Me.IdEmploye
rs!IdMotifAbsence = Nz(Me.IdMotifAbsence, Null)
rs!NbHeures = Nz(Me.NbHeures, Null)
rs!DateJour = dd
rs!PeriodeJour = Me.PeriodeJour
rs.Update
End If

dd = dd + 1

Loop

' libération des varaibles
rs.Close
Set rs = Nothing

Set db = Nothing

Me.Requery ' enregistrement des changements
MajPlanning ' rafraîchissement du planning

DoCmd.Close acForm, Me.Name ' fermeture du formulaire de saisie

Else
MsgBox ("Saisie incorrecte : Dates indisponibles !")
End If

Else '
MsgBox ("Saisie incorrecte : date de début postérieure à la date de fin !")
End If

Else
MsgBox ("Saisir une Absence !")
End If
End Sub

V-C-2 - Bouton de commande CmdAnnuler

Permet d'annuler la saisie en cas d'erreur.

V-C-2-a - Procédure évènementielle sur Clic

Private Sub CmdAnnuler_Click()
Me.Undo ' annule la saisie
DoCmd.Close acForm, "F_Saisie" ' ferme le formulaire
End Sub

V-C-3 - Bouton de commande CmdSupprimer

Permet de supprimer les présences ou les absences de l'employé comprises dans la période affichée sur le formulaire de saisie.

V-C-3-a - Procédure évènementielle sur Clic

Procédure évènementielle CmdSupprimer_Click

Private Sub CmdSupprimer_Click()
' Supprime les absences ou présentes comprises dans la période saisie
Dim dd As Date, df As Date

If (MsgBox("Souhaitez-vous supprimer les Absences/présences sur cette période ?", vbYesNo + vbQuestion) = vbYes) Then

dd = CDate(Me!DateDebut) ' copie dans la variable de la date de début saisie sur le formulaire
df = CDate(Me!DateFin) ' copie dans la variable de la date de fint saisie sur le formulaire

If (dd <= df) Then

' supprime les absences comprises entre la date de début et de fin excepté l'enregistrement courant sur le formulaire
DoCmd.SetWarnings False
DoCmd.RunSQL "delete * from T_Planning where ([IdPlanning]<>" & Nz(Me!IdPlanning.Value, 0) & ") and ([IdEmploye]=" & Nz(Me.IdEmploye.Value, 0) & ") and DateJour between " & FormatDateUs(df) & " and " & FormatDateUs(dd)
DoCmd.SetWarnings True

Me.Undo ' annule la saisie

If Not (Me.RecordsetClone.EOF) Then
Me.RecordsetClone.Delete ' supprime l'enregistrement courant
End If

MajPlanning ' rafraîchit le planning
DoCmd.Close acForm, Me.Name ' ferme le formulaire de saisie

Else

MsgBox ("Saisir une date de début antérieure à la date de fin !")

End If

End If
End Sub

La période de suppression est comprise entre le jour de début et le jour de fin affichés sur le formulaire.

VI - Module M_Planning

Enfin, nous présentons un condensé du module de l'application.

VI-A - Quelques fonctions importantes

Elles utilisent les fonctions Date et Heure :

Option Compare Database
Option Explicit

' Les fonctions du module.

Public Function FormatDateUs(ByVal vDate As Date) As String
' transforme la date passée en argument en date au format US
FormatDateUs = "#" & Format(vDate, "mm-dd-yyyy") & "#"
End Function

Public Function EstWeekEnd(ByVal dt As Date) As Boolean
' teste si la date passée en argument est sur un week-end ou non
EstWeekEnd = (Weekday(dt) = 1) Or (Weekday(dt) = 7)
End Function
Private Function nbJoursMois(ByVal mois As Long, ByVal annee As Long) As Long
' renvoie le nombre de jours du mois et de l'année passés en argument
nbJoursMois = Day(DateSerial(annee, mois + 1, 0))
End Function
'...

Le module contient aussi la fonction EstFerie permettant de savoir si une date est un jour férié ou pas. Elle est disponible dans la faq.

VI-B - Procédure MajPlanning

La routine permet d'actualiser le sous-formulaire SF_Planning après avoir modifié le mois sur le formulaire de planning, ou les présences et absences des employés.

Déroulé de la procédure :

- parcourt les jours du mois sélectionné sur le formulaire de planning ;

- colorie chaque colonne en fonction du jour lui correspondant et l'affiche sur l'en-tête ;

- masque les colonnes en trop si le nombre de jours est inférieur à 31 ;

- rafraîchit le planning.

Procédure MajPlanning

Public Sub MajPlanning()
' Rafraîchit le sous-formulaire de planning SF_Planning
Dim nbJours As Integer, j As Integer
Dim dtJour As Date

nbJours = DaysInMonth(Forms!F_Planning!cmbMois, Forms!F_Planning!cmbAnnee) ' nombre de jours du mois choisi
dtJour = DateSerial(Forms!F_Planning!cmbAnnee, Forms!F_Planning!cmbMois, 1) ' date du 1er jour du mois

For j = 1 To nbJours ' on parcourt les jours du mois

' on affiche sur l'en-tête le jour correspondant à la colonne, au format "L 2" pour "lundi 2"
Forms!F_Planning!SF_Planning.Form("Col" & j).Caption = UCase(Left(Format(dtJour, "ddd"), 1)) & vbCrLf & j

If EstWeekEnd(dtJour) Or EstFerie(dtJour) Then ' si week-end ou jour férié
Forms!F_Planning!SF_Planning.Form("Col" & j).BackColor = HexToLong("F9CDAA")
Forms!F_Planning!SF_Planning.Form("Jour" & j).BackColor = HexToLong("F9CDAA")

Else ' sinon
Forms!F_Planning!SF_Planning.Form("Col" & j).BackColor = 16761024
Forms!F_Planning!SF_Planning.Form("Jour" & j).BackColor = vbWhite
End If

dtJour = dtJour + 1 ' jour suivant

' On affiche la colonne correspondante sur le planning
Forms!F_Planning!SF_Planning.Form("Col" & j).Visible = True
Forms!F_Planning!SF_Planning.Form("Jour" & j).Visible = True

Next j
For j = (nbJours + 1) To 31 ' on masque les colonnes des jours en trop
Forms!F_Planning!SF_Planning.Form("Col" & j).Visible = False
Forms!F_Planning!SF_Planning.Form("Jour" & j).Visible = False
Next j
Forms!F_Planning!SF_Planning.Requery ' on rafraîchit le planning
End Sub

La procédure est déclarée publique afin de pouvoir l'appeler depuis n'importe quel formulaire.

VII - Paramétrage du planning

L'application permet de gérer les heures de présence ou les absences sur la journée complète ou sur plusieurs tranches horaires.

Pour une gestion des présences sur la journée complète, il suffit de l'indiquer dans la table T_PeriodeJour.

Par exemple, pour un horaire collectif de travail de 8 heures à 18 heures, on enregistre dans la table :

PeriodeJour

NumOrdre

08h-18h

1

L'affichage du formulaire de planning donne :

Planning mensuel

Dans ce cas, vous pouvez masquer la colonne « Période Jour » en mettant la propriété Visible de la zone de texte PeriodeJour et de l'en-tête à faux.

VIII - Application à télécharger

La base exemple est au format accdb.

Pour faciliter son développement et assurer sa portabilité, l'application n'utilisera pas de composants externes à Access (ActiveX ou autres).

IX - Remerciements

Un grand Merci à toute l'équipe de Dvp et plus particulièrement à :

Pour leurs remarques et conseils avisés :
. Gayot
. Philippe JOCHMANS
. Domi2
. Jeannot45
. Arkham46

Pour leurs relectures :
. Pierre Fauconnier
. Jeannot45