Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Postes de travail et absences
Grâce au
VBA Excel , nous allons apporter une solution très simple pour affecter des salariés sur des postes de travail, sur un mois complet, tout en tenant compte des absences recensées en fonction des dates.
Sur l'exemple illustré par la capture, nous travaillons sur un
planning des affectations des postes de travail . Si l'utilisateur clique sur une case de la première ligne, pour le premier jour du mois, une
liste déroulante se propose et lui offre un choix parmi cinq salariés. Pourtant, s'il clique sur une case de la deuxième ligne, pour le deuxième jour du mois, c'est une
liste déroulante de sept salariés qui se suggère cette fois.
Dans cette solution finalisée, c'est un
code VBA Excel qui se déclenche automatiquement pour reconstruire ces listes déroulantes à la volée, en fonction des
indisponibilités constatées dans un autre
planning , celui des
absences .
Classeur Excel à télécharger
Nous suggérons d'appuyer les travaux sur un
classeur Excel hébergeant ces
deux plannings .
Nous débouchons sur la première des deux feuilles de ce classeur. Elle est nommée
Affectations . Et précisément, des affectations de postes sont déjà réalisées dans le
planning qui se propose au centre de la feuille. Si vous cliquez sur l'une ou l'autre de ses cases, vous remarquez la présence de listes déroulantes qui se suggèrent automatiquement. Mais à ce stade bien sûr, elles ne sont pas dynamiques. Elles sont figées sur une liste statique des salariés. Elles ne tiennent donc pas compte des absences potentielles.
En bas de la fenêtre Excel , cliquer sur l'onglet Absences pour activer sa feuille,
Nous y découvrons un
planning architecturé exactement de la même façon que le premier. Mais celui-ci est destiné à y marquer les
absences en regard des jours et des salariés concernés.
C'est grâce à cette organisation similaire des deux plannings que nous allons résoudre le cas en toute simplicité. L'idée est la suivante. A chaque clic de l'utilisateur dans une cellule du premier planning, le
code VBA Excel doit parcourir toutes les cellules de la même ligne dans le second planning, celui des absences. Dès qu'aucune mention n'est observée dans une case, le nom du salarié disponible correspondant doit être ajouté à la liste à proposer à l'utilisateur pour l'
affectation de poste .
La procédure événementielle
L'analyse par le
code VBA doit être déclenchée automatiquement à chaque clic de l'utilisateur dans une cellule du premier planning. Pour cela, l'
objet Worksheet (feuille) propose une petite panoplie d'événements associés, dont un particulièrement dédié.
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel ,
Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Feuil3(Affectations) ,
Ainsi et au centre de l'écran, nous affichons la
feuille de code VBA associée à la première feuille du classeur, celle du
planning des affectations . Ce sont en effet les clics sur ce dernier que nous devons intercepter.
En haut de la feuille, déployer la liste déroulante de gauche,
Puis, choisir l'objet Worksheet,
Nous créons ainsi la
procédure événementielle Worksheet_SelectionChange . Son code se déclenchera à chaque nouvelle sélection, donc à chaque clic de l'utilisateur sur cette première feuille.
Remarque : Pour simplifier la construction du
code VBA notamment, nous avons attribué des noms à ces deux plannings. Le premier est reconnu sous l'intitulé
planning tandis que le second est nommé
absences . Vous pouvez le constater en déployant la
zone Nom en haut à gauche de l'une ou l'autre feuille du classeur.
Les variables
Ensuite, nous avons besoin de quelques variables, notamment pour connaître l'indice de la ligne cliquée ainsi que le nombre de colonnes à parcourir.
...
Dim laLigne As Byte: Dim nbCol As Byte: Dim colonne As Byte
Dim laListe As String: Dim feuilleDispo As Worksheet
...
Les trois premières variables sont déclarées comme des
entiers courts (Byte). Elles doivent respectivement représenter l'
indice de la ligne cliquée , le
nombre de colonnes à analyser dans le second planning, et un
compteur à incrémenter pour justement les passer toutes en revue, tour à tour.
La
variable laListe est typée comme un
texte (String). Son rôle est d'enregistrer
tous les salariés disponibles pour la date demandée. Enfin, la dernière variable (feuilleDispo) est un
objet déclaré comme une
feuille (Worksheet). Il doit représenter la
feuille des absences sur laquelle le
code VBA doit porter son analyse.
Les coordonnées du clic
Il n'est pas nécessaire de déclencher le traitement lorsque la cellule cliquée est en dehors du planning des affectations. Nous devons donc réaliser un test pour vérifier ses coordonnées. Et justement, l'
objet Target passé en
paramètre de cette
procédure événementielle représente cette cellule, au moment où elle reçoit le clic.
Après la déclaration des variables, créer l'instruction conditionnelle suivante :
...
If Not Intersect([planning], Target) Is Nothing Then
End If
...
C'est un grand classique désormais dans nos développements, nous exploitons la
fonction VBA Intersect pour recouper deux plages de cellules, celle du planning et celle représentant la cellule cliquée. Si cette intersection n'est pas vide (Not ... Is Nothing), nous savons que la cellule cliquée est bien à l'intérieur du planning. Dans ces conditions (Then), nous décidons de poursuivre.
L'initialisation des variables
Avant de poursuivre, nous devons initialiser les variables, notamment pour l'indice de ligne, le nombre de colonnes à analyser et la feuille à piloter.
Dans les bornes de l'instruction conditionnelle, ajouter les affectations suivantes :
...
laListe = ""
laLigne = Target.Row
nbCol = [absences].Columns.Count + 2
Set feuilleDispo = Sheets("Absences")
...
Nous prélevons l'
indice de la ligne cliquée grâce à la
propriété Row de l'
objet Target . La
propriété Count de la
collection Columns appartenant à la
plage absences renseigne sur le
nombre de colonnes de cette dernière. Comme il existe deux colonnes en entête de ce planning, nous ajoutons deux unités à ce score. En effet, en valeur absolue, nous aurons besoin de boucler jusqu'à la dernière colonne de ce planning pour n'omettre aucune cellule. Enfin, nous initialisons (Set) l'
objet feuilleDispo sur la
feuille des absences .
Parcourir les colonnes des absences
Maintenant que le
nombre de colonnes est connu et recalibré, nous allons pouvoir engager une
boucle For Next , pour les parcourir toutes en partant de la troisième. En effet, l'inscription des absences comme des affectations débute à partir de la colonne C.
A la suite du code de l'instruction conditionnelle, créer la boucle suivante :
...
For colonne = 3 To nbCol
Next colonne
...
Liste des salariés disponibles
A chaque passage dans cette boucle et pour la ligne en cours (laLigne), chaque salarié disponible doit être ajouté à la suite, dans la
variable laListe .
Dans les bornes de la boucle, créer la nouvelle instruction conditionnelle suivante :
...
For colonne = 3 To nbCol
If (feuilleDispo.Cells(laLigne, colonne).Value = "") Then
laListe = laListe & "," & feuilleDispo.Cells(3, colonne).Value
End If
Next colonne
...
Sur la ligne de la cellule cliquée (laLigne) et pour la colonne en cours d'analyse par la boucle (colonne), si la cellule correspondante dans le planning des absences ne porte aucune mention (Value = ""), nous ajoutons le salarié en cours d'analyse (feuilleDispo.Cells(3, colonne).Value) à la
liste des personnes disponibles . Avec ce processus récursif, a l'issue du traitement, nous obtiendrons bien la consolidation des salariés qui ne sont pas absents, pour le jour demandé par le clic de l'utilisateur sur le premier planning.
Vous remarquez la présence de la virgule dans cette concaténation (& "," &). Elle est très importante dans la syntaxe pour la construction de la liste déroulante, à partir de cette liste des personnes disponibles.
Créer la liste déroulante
La cellule active sur le premier planning est représentée en VBA par l'
objet Selection . C'est effectivement sur cette sélection que nous devons ajouter une
liste déroulante . Cet
objet Selection propose une propriété qui se nomme
Validation , pour notamment
créer une liste déroulante , comme nous le ferions en manuel depuis l'outil Excel
Validation des données .
Toujours dans l'instruction conditionnelle mais après la boucle, créer le bloc With suivant :
...
Next colonne
With Selection.Validation
.Delete
.Add xlValidateList, , , laListe
End With
End If
...
Ce bloc permet de ne pas répéter l'objet (Selection) et sa propriété (Validation) puisqu'ils sont appelés à deux reprises. Toute d'abord, avec la
méthode Delete pour détruire la potentielle présence d'une précédente liste déroulante en lieu et place. C'est ensuite la
méthode Add qui intervient pour construire cette
liste déroulante , grâce à la
valeur xlValidateList en premier argument et à la
source de données (laListe) en quatrième argument. La succession des virgules nous permet d'ignorer les paramètres de la méthode qui ne sont pas nécessaires dans cette construction.
Notre développement est terminé. Nous pouvons donc tester le résultat.
Enregistrer les modifications (CTRL + S) et basculer sur la première feuille du classeur,
Puis, réaliser quelques clics dans différentes cellules,
Comme vous pouvez l'apprécier, d'un jour sur l'autre, les contenus de ces listes déroulantes différent, en fonction des absences des uns et des autres. En revanche à ce stade, rien n'empêche l'utilisateur d'affecter deux fois le même salarié disponible sur une même journée. Mais une mise en forme conditionnelle l'alerte aussitôt, avec une couleur orange.
Si vous souhaitez la consulter :
Cliquer sur une case du planning,
Dans la section Styles du ruban Accueil , cliquer sur le bouton Mise en forme conditionnelle ,
En bas des propositions, choisir l'option Gérer les règles ,
Grâce à la
fonction Nb.Si , elle détecte la présence des doublons sur une même ligne, dont elle change la couleur.
Cela dit, nous aurions très bien pu résoudre le cas en étoffant notre code VBA. Pour cela, il aurait suffi d'imbriquer une seconde boucle dans la première, mais cette fois pour parcourir les cellules du premier planning pour la ligne en cours. Le critère aurait consisté à vérifier la présence des salariés déjà affectés, pour ne pas les ajouter dans la liste des personnes disponibles.