VBA pour génerer un planning

hypo78

XLDnaute Impliqué
Bonjour à tous,

Après quelques mois d'absence me revoilà parmi vous pour vous exposer un nouveau problème.

J'aurais besoin de votre aide précieuse pour :
  • à partir d'une DATA contenant des noms de personnel et des compétences générer un planning automatiquement (voir exemple très simplifié ci-joint). Ce dernier devra contenir autant de ligne par personnel que ce dernier a de compétence.... pas clair ma phrase mais l'exemple est parlant ;)
  • une fois que ce planning est généré, il devient très difficile à manipuler car dans la réalité j'ai environ 300 personnels, d'où ma 2ème requête : lorsque je choisi ouvrir le planning COMP1, masquer les lignes des personnels n'ayant pas cette compétence, mais garder à l'affichage toutes les lignes se rapportant à l'agent ayant cette compétence.
 

Pièces jointes

  • planning.xlsx
    19.2 KB · Affichages: 71

Dranreb

XLDnaute Barbatruc
Bonsoir.

Dans un module standard
VB:
Option Explicit

Sub GénérerPlanning()
Dim TE(), TS(), LE&, C&, LS&
TE = Feuil1.UsedRange.Value
ReDim TS(1 To 1000, 1 To 33)
For LE = 3 To UBound(TE, 1): For C = 3 To UBound(TE, 2)
   If Not IsEmpty(TE(LE, C)) Then
      LS = LS + 1
      TS(LS, 1) = TE(LE, 1)
      TS(LS, 2) = TE(2, C): End If: Next C, LE
Feuil3.[A5].Resize(LS, 33).Value = TS
End Sub

Remarquez, j'ai enlevé les bordures horizontales sur les 2 1ères colonnes, mis le format de nombre ;;; et enfin j'ai ajouté une MeFC qui annule cela :

upload_2016-11-26_19-50-39.png


Ça permet tout à le fois de ne pas afficher de répétition tout en reclassant la liste par compétences.
 
Dernière édition:

hypo78

XLDnaute Impliqué
Bonsoir Dranreb,
j'ai essayé ton code dans le fichier joint, çà fonctionne, par contre il me faudrait une ligne indisponibilité pour chaque agent, et comme je n'arrive pas à comprendre ton code il est difficile pour moi de le modifier.

as-tu une idée pour ma deuxième requête?

PS: merci pour ton annotation sur la mise en forme, mais je me pencherai dessus si j'arrive à faire fonctionner le planning ;)

D'avance merci
 

Pièces jointes

  • planning.xlsm
    24.1 KB · Affichages: 63

Dranreb

XLDnaute Barbatruc
Dommage que vous ne me disiez pas ce que vous n'arrivez pas à comprendre dans ce code tout simple: ça vous aurait peut être permis de l'ajouter vous même.
VB:
Sub GénérerPlanning()
Dim TE(), TS(), LE&, C&, LS&
TE = Feuil1.UsedRange.Value
ReDim TS(1 To 1000, 1 To 33)
For LE = 3 To UBound(TE, 1)
   For C = 3 To UBound(TE, 2)
      If Not IsEmpty(TE(LE, C)) Then
         LS = LS + 1
         TS(LS, 1) = TE(LE, 1)
         TS(LS, 2) = TE(2, C): End If: Next C
   LS = LS + 1
   TS(LS, 1) = TE(LE, 1)
   TS(LS, 2) = "Indisponibilité": Next LE
Feuil3.[A5].Resize(LS, 33).Value = TS
End Sub
 

hypo78

XLDnaute Impliqué
Re,

merci pour cette réponse rapide, je tâtonne vraiment en VBA, mes demandes les années précédentes étaient toute autres et les codes ne ressemblaient pas du tout à çà.
Redim, UBound.. çà ne me parle pas.
Je vais chercher ;)

Bonne fin de soirée et si vous avez un moment pour ma 2ème requête ;)
 

Dranreb

XLDnaute Barbatruc
Pour la deuxième requête il me semblait que le souci c'était d'arriver à voir ensemble les lignes de toutes les personnes pour une certaine compétence, dans le but, je suppose, d'en sélectionner une seule. C'est pourquoi je propose de classer le tableau tantôt par compétences tantôt par noms.
C'est exprès que les noms sont répétés sur chaque ligne dans ce but. Mais la MeFC peut faire en sorte que seules la 1ère apparition dans chaque paquet soit affichée.

Redim permet de fixer les dimensions d'un tableau dynamique.
UBound(Tableau, N) donne la plus grande Nième dimension du Tableau.

Travailler avec des tableaux dynamiques en mémoire est beaucoup plus rapide que d'attaquer directement les cellules individuellement.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je n'ai pas d'idée pour le moment, pour le faire autrement qu'en classant la liste par compétence. Comme ça vous auriez tous les agents qui l'ont à raison d'une ligne pour chacun.
Si vous me disiez le but de la chose…
C'est peut être pour ne pas affecter aussi une tâche à un agent à qui une autre est déjà affectée ? C'est sûr, classé par compétence c'est ça du coup qui se voit moins bien. Alors peut être une MeFC qui grise les cellules des agents à qui une compétence à été assignée ?
Ça peut se faire avec cette formule de MeFC : =ET(C5="";SOMME((C$5:C$1000<>"")*($A$5:$A$1000=$A5))>0)
 
Dernière édition:

hypo78

XLDnaute Impliqué
Bonjour,
Pour vous expliquer mon besoin ; actuellement nous avons une vingtaine de plannings correspondant à autant de spécialités (compétence). Chaque gestionnaire de planning remplit son classeur en fonction des indisponibilités de ses agents. La spécialité 1 est prioritaire sur la 2 et ainsi de suite. Pour autant certaine spécialités sont cumulables d'où l'intérêt d'avoir un visu sur toutes les compétences de l'agent concerné. Aujourd’hui il n'existe aucun lien entre les plannings, d'où la difficulté à les établir en tenant compte des autres.
Pour ces raisons, je me suis dis qu'il serait plus simple d'établir un classeur unique sur lequel on retrouve toutes les spécialités pour chaque agent.
Peut-être qu'avec vos connaissances vous imaginez un système plus simple que celui que j'essaye de monter avec votre aide.
Encore merci pour votre écoute et votre aide.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
C'est quoi ces indisponibilités ?
Devrait-ce se cocher tout seul pour un agent dès qu'une de ses compétences est cochée et empêcher d'en cocher une autre ?
En tout cas il devrait être possible d'assister la saisie lors de la sélection d'une cellule en mettant à la fois une coche verte sur une cellule vide et une croix rouge sur les autres compétences de la même personne, ou défaire tout cela en sélectionnant une cellule portant une coche. La sélection d'une croix demeurerait sans effet. Demeurerait-il nécessaire de masquer des lignes malgré ces dispositif s'il était en plus possible de classer à volonté la liste par simple clic sur un titre de colonne ?
Les cases seraient en police Wingding alors.
 

hypo78

XLDnaute Impliqué
Bonjour,
Le premier type d'indisponibilité c'est quand l'agent n'est pas là. Je souhaite faire un Userform avec une combobox, on choisit le nom de l'agent, çà affiche sa ligne indisponibilité et on met un "I" les jours où il n'est pas disponible pour assurer une garde. Avec les MeFC, je pense qu'effectivement ce serait une bonne solution pour signaler sur ses lignes compétences qu'il n'est pas dispo à cette date.
Lorsqu'il est retenu sur une compétence, le gestionnaire doit juste regarder sur les lignes du dessus si il n'a pas été déjà retenu, d'où mon besoin de faire un tri par compétence tout en affichant les autres pour un agent détenant cette compétence.

cordialement
 

hypo78

XLDnaute Impliqué
Bonsoir,

désolé de n'avoir pu répondre plus tôt.
Pour répondre à votre dernière question, dans mon fichier final j'ai environ 300 personnels et une vingtaine de compétences. çà devrait faire un fichier avec environ 1500 lignes. Si l'on peut faire un tri par compétence qui permet de conserver toutes les lignes de l'agent çà me va, car certains peuvent doubler un même jour 2 compétences d'où la nécessité d'avoir un visu dessus.
Cordialement
 

hypo78

XLDnaute Impliqué
Bonjour,

le système de mise ne forme des cellules est vraiment génial.

Par apport aux besoins, si j'arrive à finaliser ce projet, il va en découler un décompte en fonction d'une valeur saisie (G, GC, J, N.....) dans mes cellules, ce qui risque de compliquer la chose.

J'ai envoyé votre solution à mes collègues pour avis et reste le problème de masquer les lignes pour les gestionnaires de planning.

Merci pour votre investissement.
 

Statistiques des forums

Discussions
312 104
Messages
2 085 332
Membres
102 864
dernier inscrit
abderrashmaen