1. Livres & vidéos
  2. Apprenez le langage VBA
  3. Gestion des employés
Extrait - Apprenez le langage VBA et devenez un expert sur Excel (3e édition)
Extraits du livre
Apprenez le langage VBA et devenez un expert sur Excel (3e édition) Revenir à la page d'achat du livre

Gestion des employés

Calcul de la durée et du planning : description de l’exemple

Présentation de l’exemple

L’objectif de cet exemple est de réaliser le planning du projet informatique de portail client de la société SacEni avec les ressources en main d’œuvre à disposition. Un ensemble de tâches doit être réalisé pour délivrer le projet.

Les ressources

Chaque ressource a un poste : manager, concepteur, développeur ou testeur.

Chaque ressource a indiqué sa disponibilité sur la période allant du 01/04/2026 au 30/06/2026.

Les tâches

Chaque tâche est considérée comme exécutée lorsque le nombre de jours par poste a été consommé. Elles débutent lorsque les tâches précédentes ont été réalisées et se terminent lorsque les ressources nécessaires ont été affectées.

Objectif

L’objectif est de déterminer la date au plus tôt pour finir le projet en fonction de la disponibilité des ressources. Il sera demandé également d’avoir une représentation graphique de cette date de fin.

Présentation du fichier

 Ouvrez le fichier Enoncé_5-ABC.xlsm qui se compose de deux feuilles : Planning et Taches.

Voici la liste des plages nommées existantes réparties...

Calcul de la durée et du planning : notions de cours

Formules de date

Les formules de date permettent de faire des opérations sur les dates : ajouter/compter des jours, trouver la fin de mois…

Calculer le nombre de jours ouvrés entre deux dates

La fonction NB.JOURS.OUVRES permet de calculer le nombre de jours ouvrés entre deux dates.

La syntaxe est la suivante :

=NB.JOURS.OUVRES(date_debut ; date_fin ; [jours_feries])

  • Date_debut : correspond à la date de début de la série.

  • Date_Fin : correspond à la date de fin de la série.

  • Jours_Feries : correspond soit à un nombre de jours fériés, soit à une plage contenant les jours fériés. L’argument est facultatif, certes, mais s’il est indiqué, seul le nombre de jour(s) férié(s), situé(s) en dehors des week-ends bien sûr, sera ôté du résultat de cette fonction.

Exemple :

Calcul du nombre de jours ouvrés entre le 15 décembre 2025 et le 31 décembre 2025. L’argument est le jour férié du 25 décembre 2025.

Résultat : le nombre de jours ouvrés est 12. Pour information, si le 25 décembre était tombé un week-end, le résultat aurait été 13.

images/05SOB03N1.PNG

Avec les dates A1, A2 et B1 au format Date montrant le jour de la semaine :

images/05SOB03N2.PNG

Additionner un nombre de jours ouvrés à une date

La fonction SERIE.JOUR.OUVRE permet de renvoyer un nombre qui représente une date correspondant à une date (date de début) à laquelle est ajouté ou soustrait le nombre de jours ouvrés spécifiés.

La syntaxe est la suivante :

=SERIE.JOUR.OUVRE(date_debut ; nb_jours ; [jours_feries]) 
  • Date_debut : correspond à la date de base au calcul.

  • Nb_jours : nombre de jours à ajouter à la date de base.

  • Jours_Feries : correspond soit à un nombre de jours fériés, soit à une plage contenant les jours fériés. L’argument est facultatif.

Exemple : ajouter 25 jours ouvrés à la date du 15 décembre 2025.

Les jours fériés sont le 25 décembre 2025 et le 1er janvier 2026. Il est possible d’afficher un jour férié qui n’est pas dans...

Calcul de la durée et du planning : réalisation de l’exemple

Dans le fichier Enoncé_5-ABC.xlsm :

Calcul de la durée de chaque tâche

Date de début et date de fin

Sur la feuille Taches, la durée sera calculée dans la colonne H pour chaque tâche, toutefois il est déjà possible de définir la structure du diagramme de Gantt.

  • Colonne : la date de début minimal correspond à la date de fin de la tâche antérieure + 1.

  • Colonne : la date de fin correspond à la date de début à laquelle la durée est ajoutée.

images/05SOB03N9.PNG

Pour la colonne G, il y a une formule particulière, mais vous pouvez traiter individuellement chaque ligne :

  • Pour la date de début des tâches 2 et 3, vous prenez la date de fin de la tâche 1 à laquelle vous ajoutez 1.

  • La date de début de la tâche 4 correspond à la date de fin de la tâche 3 plus 1 jour.

  • La date de début des tâches 5 et 6 correspondent à la date de fin de la tâche 4 plus 1 jour.

  • La date de début de la tâche 7 correspond à la date de fin la plus élevée entre les tâches 5 et 6.

  • Enfin, la date de début de la tâche 8 correspond à la date de fin de la tâche 7 plus 1 jour.

 Saisissez les formules suivantes :

images/r05SOB02N.PNG

Les formules en colonne G « Date de début minimal » peuvent toutes être remplacées par la formule unique ci-après :

1. =MAX( 
   1.1. RECHERCHEV( 
      1.1.1. SI( 
          1.1.1.1. FRACTIONNER.TEXTE(F5;", ";;;;"TOP")="TOP"; 
          1.1.1.2. 0; 
          1.1.1.3. FRACTIONNER.TEXTE(F5;", ";;;;"TOP")); 
   1.2. $A$4:$I$11;9;FAUX) 
   1.3. +1 

Le fait de passer en 1.1.1.1 et 1.1.1.3. par la fonction FRACTIONNER.TEXTE tient du fait qu’en colonne F ou « Tache antérieure » nous avons comme indication une ou plusieurs tâche(s) référencée(s) en colonne A.

Nous devons choisir la date maximale correspondante (via RECHERCHEV en 1.1.) en colonne...

Gestion des présences - Outil d’administration : description de l’exemple

Présentation de l’exemple

L’objectif de cette seconde partie est de reprendre le fichier de disponibilité des ressources et d’y ajouter certaines fonctionnalités pour faciliter son utilisation.

En l’état, n’importe quel utilisateur du fichier peut modifier les présences/absences de toutes les ressources. La suite de cet exemple permettra de restreindre par un mot de passe la modification des disponibilités.

L’autre objectif de cet exemple est aussi de calculer le coût de chaque tâche et du projet au total. Le coût d’une tâche correspond au coût de chaque ressource requise pour une tâche. Il est demandé également d’optimiser le coût de chaque tâche en prenant la ressource la moins coûteuse pour une tâche.

Une contrainte très importante est à intégrer : le calendrier n’est pas fixe et il peut s’étendre bien au-delà de juin. Le fichier doit être en capacité de s’adapter à cette contrainte et générer autant de mois que nécessaire dans le calendrier.

Présentation du fichier

Le fichier Enoncé_5-DEF.xlsm est basé sur la première partie de ce chapitre puisqu’il s’agit de la même structure avec les deux feuilles Planning et Taches. La feuille Planning contient les données sur les ressources alors que la feuille Taches contient le planning de chaque tâche.

Feuille Planning

Par rapport au fichier Corrigé_5-ABC.xlsm, il existe des informations supplémentaires sur la feuille Planning :

  • Matricule (colonne B) : il s’agit d’un code unique et secret qui permet d’identifier les utilisateurs. Seuls eux en ont connaissance. Ce code sera utilisé pour leur permettre de s’identifier dans l’application.

  • Coût (colonne D) : le coût correspond au montant journalier à payer pour avoir la ressource sur le projet.

  • Ces modifications impliquent un décalage...

Gestion des présences - Outil d’administration : notions de cours

Création dynamique de contrôle

Qu’est-ce que c’est ?

Ajouter des contrôles dynamiquement signifie que de nouveaux contrôles sont créés sur le formulaire durant l’exécution.

L’ajout du contrôle est déclenché par une procédure que ce soit automatiquement ou par action de l’utilisateur.

Ajouter un contrôle se fait dans un contrôle conteneur, c’est-à-dire capable de contenir d’autres contrôles : Form, Frame, Page...

Comment cela fonctionne ?

Il faut créer un objet de type Control, puis l’ajouter sur un contrôle conteneur.

Dim MonControle As Control 'instanciation d'une variable de type  
Control 

Ajout du contrôle dans un contrôle conteneur :

Set MonControle =  
Form.ControleConteneur.Controls.Add("forms.Textbox.1")  
' ajout d'une nouvelle Textbox dans le contrôle conteneur. 

Pour les autres contrôles, voici la syntaxe à utiliser :

Contrôle

Syntaxe

ComboBox (zone de liste modifiable)

Forms.CheckBox.1

CommandButton (bouton de commande)

Forms.ComboBox.1

Frame (cadre)

Forms.CommandButton.1

Image

Forms.Frame.1

Label (étiquette)

Forms.Image.1

ListBox (zone de liste)

Forms.Label.1

MultiPage

Forms.ListBox.1

OptionButton (bouton d’option)

Forms.MultiPage.1

ScrollBar (barre de défilement)

Forms.OptionButton.1

SpinButton (toupie)

Forms.ScrollBar.1

TabStrip (bande d’onglets)

Forms.SpinButton.1

TextBox (zone de texte)

Forms.TabStrip.1

ToggleButton (bascule)

Forms.TextBox.1

Une fois le contrôle créé, il est plus simple de modifier les propriétés du contrôle.

MonControle.Name = "NomDuControle" 
MonControle.Left = 0 'positionnement sur l'axe des abscisses 
MonControle.Top = 0 'positionnement sur l'axe des ordonnées  
MonControle.Text = "Saisir un texte ici" 'Cas particulier d'une  
TextBox puisque la propriété Text n'existe...

Gestion des présences - Outil d’administration : réalisation de l’exemple

 Ouvrez le fichier Enoncé_5-DEF.xlsm.

Initialisation du formulaire

La ressource (qui reste une personne utilisatrice pour mémoire…) voulant effectuer une modification de ses disponibilités ouvrira le fichier et sera positionnée sur la feuille Taches. Elle cliquera alors sur le bouton Editer la disponibilité par personne pour s’identifier.

L’identification passera par une fenêtre de type InputBox qui demandera le matricule de la ressource puis elle accédera au formulaire.

Connexion pour une ressource

L’ensemble de ce code doit être écrit au sein de la procédure AfficherFormulairePersonne puisque c’est ce formulaire qui est appelé lorsque la personne clique sur le bouton. Cette procédure est présente dans le module Module Affichage.

 Au début du Module Affichage, écrivez l’instruction Option Explicit.

images/05SOB03N34.PNG

Voici la manipulation à réaliser :

 Tout d’abord, créez les variables :

  • Une variable de type chaîne de caractères pour stocker le matricule saisi par la personne. 

  • Une variable de type nombre entier pour parcourir les lignes du tableau contenant les ressources.

  • Une variable publique contenant la ligne de la ressource trouvée. Celle-ci doit être définie avant la procédure et doit être initialisée à 0. L’intérêt d’avoir une variable publique est de connaître à tout moment durant l’exécution la ligne où se situe la ressource dans la feuille Planning. Cela sera particulièrement utile lors de la sauvegarde ;

  • D’autres variables seront créées plus loin dans le code.

 Écrivez le code suivant :

Option Explicit 
Public LigneRessource As Integer 
Sub AfficherFormulairePersonne() 
On Error GoTo Erreur 
  Dim Matricule As String 
  Dim Ligne As Integer 
  LigneRessource = 0 
'... 
'Le reste du code de ce chapitre est à insérer ici 
'... 
Exit Sub 
Erreur: 
  Call sGestionError("AfficherFormulairePersonne") 
End Sub 

 Créez ensuite une invite de dialogue de type InputBox associée à la variable...